今天我将我的网络服务器从 Debian Buster 升级到 Bullseye,这实际上是一个非常简单的升级。在我尝试访问服务器上的几个 WordPress 站点之前,一切似乎都正常。起初我收到一些关于缺少 MySQL 模块的错误。我从 PHPMyAdmin 收到的错误消息给了我一个更好的线索:它说它缺少 mysqli 模块。
所以我安装了它, apt install php7.4-mysqli
这实际上让我的 WordPress 网站再次运行。
然而,现在唯一的问题是我无法更新 Wordpress。每次我尝试更新 WordPress 时,都会出现错误:
我怀疑我需要安装suphp。但在我这样做之前,任何人都可以确认情况确实如此吗?还是在从 Buster 升级到 Bullseye 后我需要做其他事情?
编辑: 我花了很长时间才弄清楚到底发生了什么。现在我知道了,我不知道如何解决这个问题。
WP给出的错误消息实际上是不正确的。事实证明,它能够在正确的文件夹中很好地解压缩更新。但是当它检查文件是否真正解包时,它会出错。问题在于update-core.php中的这段代码:
foreach ( $roots as $root ) {
if ( $wp_filesystem->exists( $from . $root . 'readme.html' )
&& $wp_filesystem->exists( $from . $root . 'wp-includes/version.php' )
) {
$distro = $root;
break;
}
}
if ( ! $distro ) {
$wp_filesystem->delete( $from, true );
return new WP_Error( 'insane_distro', __( 'The update could not be unpacked.' ) );
}
它在这里所做的只是检查它刚刚将 zip 文件解压缩到的文件夹中是否存在两个文件。这失败了。原因如下:
我使用 FTP 方法安装更新。因此,当我告诉它更新时,它首先会确定应该将 zipfile 下载到的文件夹。此文件夹存储在$working_dir中,并从那时起用于其余的更新过程。服务器上的真实路径是,/domains/domainname.com/htdocs/wp-content/upgrade/
但是由于 FTP 用户是 chroot 的,WP 会查找并存储/htdocs/wp-content/upgrade/
。更新文件下载到此文件夹,然后解压缩。
接下来它会进行上述检查。这失败了,因为它试图在/htdocs/wp-content/upgrade/
真实位置为/domains/domainname.com/htdocs/wp-content/upgrade/
.
我理解为什么它可以很好地下载软件包(因为 FTP 用户是 chroot 的)。但我不明白为什么它在解压之后没有失败,但是在检查文件是否存在时它确实失败了......
我检查了所有 php 设置,并没有发现与 Debian 升级之前的设置有什么不同……
我花了一段时间才弄清楚到底发生了什么,但这实际上是 WordPress 的问题。Bullseye 在安装了 Buster v1.0.47 的地方安装了 PureFTPd 1.0.49 版。根据此处PureFTPd 的变更日志,通配符已从 v1.0.48 中的 NLST 命令中删除(这是有道理的,因为根据 RFC 实际上是不允许的)。
WordPress 开发人员已经意识到了这个问题并修补了 exists() 函数。该补丁可在此处获得;如果您使用 PureFTPd 版本 1.0.48 或更高版本并且无法通过 FTP 升级,则应用它是升级 WordPress 的两种方法之一。
您也可以自己在/wp-admin/includes/class-wp-filesystem-ftpext.php(或/wp-admin/includes/class-wp-filesystem-ftpsockets.php如果您使用 FTPSockets)中替换函数以下(这实际上是我自己的功能实现):
WordPress 6.0 默认会有这个新功能。