После обновления Debian Buster до Bullseye сайты Wordpress больше не обновляются.
Сегодня я обновил свой веб-сервер с Debian Buster до Bullseye, и на самом деле это было довольно простое обновление. Казалось, все работало, пока я не попытался подключиться к нескольким сайтам WordPress на сервере. Сначала я получил ошибку об отсутствующем модуле MySQL. Сообщение об ошибке, которое я получил от PHPMyAdmin, дало мне лучшее представление: в нем говорилось, что отсутствует модуль mysqli.
Поэтому я установил его с помощьюapt install php7.4-mysqli
и это фактически заставило мои сайты WordPress снова работать.
Однако единственная проблема заключается в том, что я не могу обновить Wordpress. Каждый раз, когда я пытаюсь обновить WordPress, я получаю сообщение об ошибке:
Я подозреваю, что мне нужно установить suphp. Но прежде чем я это сделаю, может ли кто-нибудь подтвердить, что это действительно так? Или мне нужно сделать что-то еще после обновления с Бастера на Буллсай?
РЕДАКТИРОВАТЬ: Мне потребовалось немало времени, чтобы понять, что на самом деле происходит. Теперь я знаю, я понятия не имею, как решить проблему.
Сообщение об ошибке, которое выдает 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 для установки обновлений. Поэтому, когда я говорю ему обновиться, он сначала определяет папку, в которую следует загрузить zip-файл. Эта папка хранится в $working_dir и с этого момента используется для остальной части процесса обновления. Истинный путь на сервере такой: но поскольку пользователи FTP подключены к chroot, вместо этого WP находит и сохраняет. Файл обновления загружается в эту папку, а затем распаковывается.
Далее он выполняет вышеуказанную проверку. И это не удается, потому что он пытается найти файл в/htdocs/wp-content/upgrade/
в то время как истинное местоположение/domains/domainname.com/htdocs/wp-content/upgrade/
.
Я понимаю, почему он отлично загружает пакет (поскольку пользователи FTP подключены к chroot). Но я не понимаю, почему после этого не происходит сбой при распаковке, но происходит сбой при проверке существования файлов...
Я проверил все настройки PHP и не нашел ничего отличающегося от настроек, существовавших до обновления Debian…
1 ответ
Мне потребовалось некоторое время, чтобы точно понять, что происходит, но на самом деле это проблема WordPress. Bullseye устанавливает версию PureFTPd 1.0.49, тогда как в Buster была установлена версия 1.0.47. Согласно журналу изменений PureFTPd здесь, подстановка была удалена из команды NLST в версии 1.0.48 (что имеет смысл, поскольку на самом деле это не разрешено согласно RFC).
Разработчики WordPress знают о проблеме и исправили функцию существует(). Патч доступен здесь; его применение — один из двух способов обновления WordPress, если вы используете PureFTPd версии 1.0.48 или выше и застряли при обновлении через FTP.
Вы также можете самостоятельно заменить функцию в /wp-admin/includes/class-wp-filesystem-ftpext.php (или /wp-admin/includes/class-wp-filesystem-ftpsockets.php , если вы используете FTPSockets) на следующее (что на самом деле является моей собственной реализацией функции):
public function exists( $file ) {
$retval = false;
$list = ftp_nlist( $this->link, $file );
if( ! empty( $list ) ) {
// if ftp_nlist returns *something*, the file or directory exists, on any FTP server
$retval = true;
} else {
// if ftp_nlist returns nothing, either the file/dir doesn't exist or it's a file and
// the FTP server's NLST command doesn't support globbing (i.e. Pure-FTPD > v1.0.47)
// Check if it'a file
if( ftp_size( $this->link, $file ) >= 0 ) {
$retval = true;
}
}
return $retval;
}
WordPress 6.0 будет иметь новую функцию по умолчанию.