在 Ubuntu 20.04 上更新 PHP 7.4 不会更新到最新版本

Updating PHP 7.4 on Ubuntu 20.04 doesn't update to the latest release

我只是想在新 Ubuntu 20.04 上安装 PHP 7.4,

做一个简单的apt install php php-cli默认安装7.4版本,

但是当我 apt update && apt upgrade 时版本仍然是 7.4.3 而不是 7.4.5!

Please note that I'm aware this can be fixed by adding ppa:ondrej/php repository.

我只是想了解,如果 Ubuntu 默认附带 7.4,为什么不更新到最新版本?即使在 2-3 年后,我们是否总是会在 Ubuntu 20.04.0(不是下一个版本)中获得 7.4.3?唯一的选择是添加 ondrej/php 存储库?

编辑:PHP 7.4.6 几周前发布了,但我服务器上的版本仍然停留在 7.4.3。

这可能是 apt 的问题。无论出于何种原因,apt update && apt upgrade 看起来都指向该软件的旧版本。如果绝对有必要,您可能确实需要通过 GitHub 或其他一些受信任的来源手动安装最新的 PHP 版本。

Ubuntu official repository 表明 7.4.3 是最新的可用版本。所以这不是 @blizzo 所建议的 apt 或缓存的问题。

由于我们谈论的是 Ubuntu 的 LTS 版本,因此出于稳定性原因,某些软件包通常会过时几个月。 (即使是补丁版本也会引入让 thinks unreality 不可靠的错误,而 LTS 意味着非常稳定和可靠)

正如您在原始问题上所写,最好的解决方案是使用 ondrej/php 存储库。

编辑:

我问过 ondrej,他用这个 link 轻轻地回答:https://wiki.ubuntu.com/StableReleaseUpdates 说:

Once an Ubuntu release has been completed and published, updates for it are only released under certain circumstances, and must follow a special procedure called a "stable release update" or SRU.

2. When

2.1. High-impact bugs

Stable release updates will, in general, only be issued in order to fix high-impact bugs.

2.2. Other safe cases

...

请使用以下代码更新 php 7.4.15

  sudo add-apt-repository ppa:ondrej/php
  
  sudo apt-get update
  
  sudo apt-get install -y php7.4 php7.4-cli php7.4-common php7.4-fpm

  sudo apt-get install -y php7.4-mysql php7.4-dom php7.4-simplexml php7.4-ssh2 php7.4-xml php7.4-xmlreader php7.4-curl  php7.4-exif  php7.4-ftp php7.4-gd  php7.4-iconv php7.4-imagick php7.4-json  php7.4-mbstring php7.4-posix php7.4-sockets php7.4-tokenizer

  sudo apt-get install -y php7.4-mysqli php7.4-pdo  php7.4-sqlite3 php7.4-ctype php7.4-fileinfo php7.4-zip php7.4-exif

   sudo nano /etc/php/7.4/fpm/php.ini
   
              Find: cgi.fix_pathinfo  => Remove semi-colon and set 0

              cgi.fix_pathinfo=0

保存并退出

php-v

您的 php 版本已更新。

请注意,这可能会毁了一切。我一直在使用 Ubuntu 附带的 PHP 7.4.3。我添加 ppa:ondrej/php 的体验并不好。

apt upgrade 首先要我安装 PHP 7.4 和 PHP 8.0。然后它使 PHP 8.0 成为默认值,并希望我 运行 apt autoremove 摆脱重复的 PHP 7.4 安装。

重新启动 Apache 导致它因错误而失败并关闭了我的所有网站。

apt install libapache2-mod-php7.4 是恢复服务器所必需的,现在显示 PHP 7.4.16,但我的所有网站都抛出服务器错误,表明我的 PHP none扩展被安装了。重新安装 PHP 7.4 的所有扩展后,又一次 Apache 重启恢复了我的网站。

update-alternatives --config php 还帮助将 CLI 版本重置回 7.4.16。

发现这个问题和 none 的答案对我有用,有用的是:

sudo a2dismod php7.2
sudo a2enmod php7.4
sudo service apache2 restart

根据您当前的模块php7.2调整

之前接受的是错误的

这个声明

it's common that some packages remain outdated for a few months

给人的印象是 Ubuntu LTS 版本在 PHP 团队发布几个月后不断升级到最新的次要版本。

这不是真的!

Ubuntu的更新政策

TL;DR Ubuntu 的官方打包 PHP 是最新的安全明智和过时的错误修复-明智的。

这里是 Ubuntu / Canonical 实际维护官方软件包的方式 PHP:

当 Ubuntu 准备 LTS 版本时,功能冻结 (details) 在某个时间点。这意味着即使打包软件在 Ubuntu 的功能冻结之前和最终的 LTS 版本之后发布了更新的次要版本(例如修复错误),这个次要版本更新也不会进入 Ubuntu 了。

在 Ubuntu Focal Fossa 20.04 LTS 的情况下,PHP 在版本 7.4.3 中被冻​​结。这意味着 Focal 的 php 软件包在其支持生命周期内将永远不会再获得次要版本更新(例如 7.4.6)。

然而,这并不意味着 Fossa 的 php 软件包永远不会得到更新。

SRU

事实恰恰相反:它将使用这些所谓的 稳定版本更新 或简短 SRUs.

进行修补

那么什么进入 SRU?

主要修复 高影响错误,这些错误大多数时候归结为安全错误。请参阅 SRUs 以了解 Ubuntu 认为影响很大的错误。

无论如何,你最终得到的是 Focal Fossa 在其整个生命周期中收到 PHP 7.4.3 的多个补丁版本。换句话说,Focal Fossa 中存在多个 PHP 7.4.3 版本,如您在软件包 change log 中所见。 它显示多个版本,如 7.4.3-4ubuntu17.4.3-4ubuntu27.4.3-4ubuntu2.5 等,您可以看到大部分安全漏洞已修复。

如何查看实际安装的是哪个版本?

问题是 php -v 将始终报告 PHP 7.4.3。但是,请查看输出的详细信息:PHP 7.4.3 (cli) (built: Jul 5 2021 15:13:35) ( NTS )。它建于 2021 年 7 月 5 日,这已经暗示看似旧的 7.4.3 版本发生了一些变化。

要真正确定安装了哪个版本,请询问 apt:apt policy php7.4

输出:

在本例中安装了 7.4.3-4ubuntu2.5。再次查看包的 change log 以查看该构建中包含的内容。

是否所有影响 PHP 7.4 的安全漏洞都已修复?

是的。

PHP 7.4 ChangeLog 相比,您会发现除一个(afaik 仅 Windows 受影响)之外的所有安全问题 (CVE) 都已在 Ubuntu 包中修复。除此之外,仅包含一些非安全错误修复。

Ubuntu 的安全团队密切 tracking the CVE database and maintains its own Ubuntu CVE tracker.

你应该使用 Ubuntu 的官方 PHP 包吗?

这取决于你的情况。我倾向于说这是一个很好的默认值。

无论如何,您应该根据以下事实做出决定:

当您使用 Ubuntu 的官方 PHP 包时,您可以确定它会在实际 Ubuntu 版本的整个生命周期内收到安全更新(5 年例如 Focal Fossa 20.04 这样的 LTS 版本)。即使 PHP 7.4 生命周期结束(2022 年底),Ubuntu 的安全团队仍将修补官方 php7.4 软件包。换句话说,即使 PHP 团队不再发布安全修复程序,Ubuntu 的安全团队也会发布。

相比之下,当您使用 Ondrej 的 PPA 之类的东西时,您必须在 2022 年底后切换到 PHP 8。如果不这样做,您的 PHP 将不再获得安全修复。

虽然 Ubuntu 的 php 软件包将获得安全修复,但几乎不会获得其他类型的错误修复。要么你很幸运并且你的软件没有受到影响,要么你将不得不解决这些错误。如果一个 bug 严重影响了你的软件(例如性能问题),你可以考虑切换到 PPA 包。