Рейтинг:0

После обновления Debian Buster до Bullseye сайты Wordpress больше не обновляются

флаг cn

Сегодня я обновил свой веб-сервер с Debian Buster до Bullseye, и на самом деле это было довольно простое обновление. Казалось, все работает, пока я не попытался зайти на несколько сайтов WordPress на сервере. Сначала я получил ошибку об отсутствующем модуле MySQL. Сообщение об ошибке, которое я получил от PHPMyAdmin, дало мне лучшую подсказку: в нем говорилось, что отсутствует модуль mysqli.

Поэтому я установил его с помощью apt установить php7.4-mysqli и это фактически заставило мои сайты WordPress снова работать.

Однако теперь единственная проблема заключается в том, что я не могу обновить Wordpress. Каждый раз, когда я пытаюсь обновить WordPress, я получаю сообщение об ошибке:

Ошибка обновления WordPress

Я подозреваю, что мне нужно установить suphp. Но прежде чем я это сделаю, может ли кто-нибудь подтвердить, что это действительно так? Или мне нужно сделать что-то еще после перехода с Buster на Bullseye?

РЕДАКТИРОВАТЬ: Мне потребовалось довольно много времени, чтобы понять, что на самом деле происходит. Теперь я знаю, я понятия не имею, как решить проблему.

Сообщение об ошибке, которое выдает WP, на самом деле неверно. Как оказалось, это является смог нормально распаковать обновление в нужную папку. Но когда он проверяет, действительно ли файлы были распакованы, что-то идет не так. Проблема заключается в этом фрагменте кода в обновление-core.php:

foreach ($roots как $root) {
  если ($wp_filesystem->exists($from. $root. 'readme.html')
    && $wp_filesystem->exists($from . $root . 'wp-includes/version.php')
  ) {
    $ дистрибутив = $ корень;
    сломать;
  }
}
    
если ( ! $ дистрибутив ) {
  $wp_filesystem->удалить($from, true);
  return new WP_Error('insane_distro', __('Не удалось распаковать обновление'));
}

Здесь он просто проверяет наличие двух файлов в папке, в которую он только что распаковал zip-файл. Это не удается. А причина в следующем:

Я использую метод FTP для установки обновлений. Поэтому, когда я говорю ему обновить, он сначала определяет папку, в которую он должен загрузить zip-файл. Эта папка хранится в $working_dir и с этого момента используется для остальной части процесса обновления.Истинный путь на сервере /domains/domainname.com/htdocs/wp-content/upgrade/ но так как пользователи FTP имеют chroot, WP находит и сохраняет /htdocs/wp-контент/обновление/ вместо. Файл обновления загружается в эту папку, а затем распаковывается.

Затем он выполняет вышеуказанную проверку. И это не удается, потому что он пытается найти файл в /htdocs/wp-контент/обновление/ в то время как истинное местоположение /domains/domainname.com/htdocs/wp-content/upgrade/.

Я понимаю, почему он отлично загружает пакет (поскольку пользователи FTP имеют chroot). Но я не понимаю, почему он не распаковывается после этого, но не работает при проверке существования файлов...

Я проверил все настройки php и не могу найти ничего, что отличалось бы от настроек до обновления Debian…

Zippy1970 avatar
флаг cn
Просто хотел добавить, что suphp **не** установлен в Buster. Кроме того, я только что заметил, что обновление плагинов работает, но после обновления плагина мой сайт WordPress остается в режиме обслуживания (это означает, что он создал файл .maintenance, но не удалил его)...
Рейтинг:0
флаг cn

Мне потребовалось некоторое время, чтобы понять, что именно происходит, но на самом деле это проблема с WordPress. Bullseye устанавливает версию 1.0.49 PureFTPd там, где в Buster была установлена ​​версия 1.0.47. Согласно журналу изменений PureFTPd здесь, подстановка была удалена из команды NLST в версии 1.0.48 (что имеет смысл, поскольку она фактически не разрешена в соответствии с RFC).

Разработчики WordPress знают об этой проблеме и исправили функцию exists().Патч доступен здесь; его применение — один из двух способов обновить WordPress, если вы используете PureFTPd версии 1.0.48 или выше и застряли с обновлением через FTP.

Вы также можете самостоятельно заменить функцию в /wp-admin/includes/class-wp-filesystem-ftpext.php (или же /wp-admin/includes/class-wp-filesystem-ftpsockets.php если вы используете FTPSockets) со следующим (на самом деле это моя собственная реализация функции):


        публичная функция существует ( $ файл ) {
          $ретвал = ложь;

          $list = ftp_nlist($this->link, $file);
          если ( ! пусто ( $ список )) {
            // если ftp_nlist возвращает *что-то*, файл или каталог существует на любом FTP-сервере
            $ретвал = истина;
          } еще {
            // если ftp_nlist ничего не возвращает, то либо файл/каталог не существует, либо это файл и
            // команда NLST FTP-сервера не поддерживает подстановку (т. е. Pure-FTPD > v1.0.47)
            // Проверяем, файл ли это
            если ( ftp_size ( $ this-> ссылка, $ файл ) >= 0 ) {
              $ретвал = истина;
            }
          }
          вернуть $ретвал;

        }

WordPress 6.0 будет иметь новую функцию по умолчанию.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.