Ошибки после обновления PHP: как найти и исправить
Три сита разной величины на светлой подложке, в крупном лежат белые шарики и один зелёный над ячейкой

Ошибки после обновления PHP: как найти и исправить

После обновления PHP сайт чаще всего ломают удалённые функции, строгие типы и несовместимые плагины. Включите логи, найдите первую ошибку и исправьте её или откатитесь.

Ошибки после обновления PHP: почему сайт ломается и что с этим делать

Ошибки после обновления PHP возникают из-за удалённых функций, более строгой проверки типов и несовместимых плагинов или расширений. Их находят по логам, а исправляют заменой устаревшего кода, обновлением модулей или откатом версии.

Главное правило: не гадайте. Любая ошибка после смены версии PHP оставляет след в логе, и первая фатальная запись почти всегда указывает на причину.

Вы нажали кнопку «Обновить версию PHP» в панели хостинга, и сайт отвечает белым экраном, ошибкой 500 или сообщением Fatal error. Знакомая ситуация для владельцев сайтов на WordPress, 1С-Битрикс, Joomla, MODX и самописных движках.

Ниже разберём, что именно меняется между версиями PHP, как выглядят типичные симптомы, как пошагово найти причину и что сделать, чтобы следующее обновление прошло без простоя и потери позиций в Яндексе и Google.

Почему обновление PHP вообще способно сломать сайт

PHP развивается быстро, и каждая крупная ветка меняет поведение языка. Что-то удаляют, потому что оно давно считалось небезопасным или неудобным. Что-то делают строже, чтобы разработчик раньше замечал ошибки в логике. Что-то просто перестаёт работать из-за изменений в самом ядре или в расширениях.

Сайт же часто живёт годами: тема написана подрядчиком в 2016 году, плагин не обновлялся с 2019-го, а в корне лежит скрипт, который «просто работает». Пока версия PHP не менялась, всё это не вызывало вопросов. После обновления накопленный «технический долг» проявляется одновременно.

Отдельная причина — окружение. Новая версия PHP на сервере почти всегда работает со своим набором расширений и своим файлом php.ini. Если на старой версии был включён модуль mbstring или ionCube Loader, на новой его может не быть, пока вы не включите его вручную.

Зачем обновлять PHP, несмотря на риски

  1. 01

    Безопасность: версии, снятые с поддержки, не получают исправлений уязвимостей, а старые ветки 7.x и 8.0 уже не обновляются.

  2. 02

    Скорость: PHP 8.x заметно быстрее старых веток на типичных CMS, особенно вместе с включённым OPcache и JIT-оптимизациями там, где они применимы.

  3. 03

    Совместимость: свежие версии WordPress, Битрикса, Composer-пакетов и плагинов всё чаще требуют PHP 8.1 и выше.

  4. 04

    Чистый код: новые возможности (типизация, match, именованные аргументы, null-safe оператор) упрощают разработку и поддержку.

  5. 05

    Требования хостинга: провайдеры постепенно отключают старые версии, и принудительное обновление лучше провести по своему плану.

Что именно меняется между версиями

Все изменения можно разделить на три группы. Первая — удалённые возможности: функция или расширение исчезает совсем, и вызов приводит к ошибке Call to undefined function. Вторая — изменение поведения: код продолжает выполняться, но работает иначе, например сравнение строки с числом в PHP 8 даёт другой результат. Третья — устаревшие конструкции (Deprecated): пока всё работает, но в логе появляются предупреждения, а в одной из следующих версий конструкцию уберут.

Особенно болезненным считается переход с ветки 7.x на 8.x. Именно в PHP 8.0 многие предупреждения стали исключениями TypeError и ValueError, а уведомления о неопределённых переменных и ключах массива превратились в предупреждения Warning. Ниже — краткая хронология, которая поможет понять, в какой версии «сломалось» то, что вы видите в логе.

таймлайн изменений

Что и когда исчезало из PHP

  1. 01 · php 7.0Удалены mysql_*, ereg*, split

    Старый код с mysql_connect() перестаёт работать целиком и требует перехода на mysqli или PDO.

  2. 02 · php 7.2each() и create_function() — устарели

    Появляются предупреждения Deprecated, но код ещё выполняется.

  3. 03 · php 8.0Удаление и строгость

    Исчезают each(), create_function(), money_format(), доступ $str{0}. count(null) выбрасывает TypeError.

  4. 04 · php 8.1null в функции — Deprecated

    Вызов вроде strlen(null) даёт предупреждение об устаревании.

  5. 05 · php 8.2Динамические свойства

    Создание свойств объекта «на лету» помечено как устаревшее.

Как выглядят симптомы на практике

Сообщения об ошибках после обновления разнообразны, но укладываются в несколько типичных сценариев. Одни видны сразу: страница пустая или браузер показывает «500 Internal Server Error». Другие скрыты: на главной всё в порядке, а не работает корзина, форма обратной связи или личный кабинет.

В таблице ниже собраны самые частые симптомы, их вероятные причины и первое действие. Используйте её как навигатор: найдите свой случай и переходите к диагностике по логам.

СимптомВероятная причинаЧто сделать первым
Белый экран (WSOD)Фатальная ошибка при выключенном display_errorsОткрыть error_log и найти строку Fatal error
Ошибка 500Parse error или директива php_value в .htaccess, не поддерживаемая в PHP-FPMПосмотреть лог веб-сервера и проверить .htaccess
Call to undefined functionРасширение не включено или функция удалена из языкаВыполнить php -m и включить нужное расширение либо заменить функцию
Uncaught TypeError / ValueErrorБолее строгая типизация встроенных функций в PHP 8.xПривести значение к нужному типу, добавить проверку на null
Deprecated в логе или на страницеУстаревший синтаксис, который пока работаетЗаписывать в лог, исправить код в плановом порядке
Ошибка подключения к базе данныхНет mysqli или pdo_mysql, другой php.iniПроверить список расширений и параметры подключения
Composer: «require a PHP version»Зависимости рассчитаны на другую версию PHPВыполнить composer install на целевой версии, обновить пакеты

Начните с логов, а не с догадок

Самая частая ошибка при диагностике — менять всё подряд: отключать плагины, переустанавливать тему, чистить кэш. Это отнимает часы и может добавить новые проблемы. Гораздо быстрее прочитать лог.

Где искать записи: файл error_log в корне сайта или рядом с проблемным скриптом, журнал PHP-FPM, error.log веб-сервера (Nginx или Apache), раздел «Логи» в панели хостинга. Если вывод в лог выключен, включите его в php.ini или в настройках сайта: `log_errors = On`, `error_reporting = E_ALL`, `display_errors = Off`. Последний параметр важен: показывать ошибки посетителям на рабочем сайте нельзя.

В WordPress добавьте в wp-config.php константы `WP_DEBUG` и `WP_DEBUG_LOG`, и записи появятся в файле wp-content/debug.log. В 1С-Битриксе параметры вывода ошибок задаются в настройках ядра (файл .settings.php, секция exception_handling).

Пошаговый алгоритм диагностики

  1. 01

    Зафиксируйте текущую версию PHP командой `php -v` или в панели хостинга и запомните время обновления: по нему удобнее искать записи в логах.

  2. 02

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

  3. 03

    Воспроизведите ошибку и найдите в логе первую фатальную запись (Fatal error, Uncaught). Последующие сообщения часто лишь следствие.

  4. 04

    Определите источник по пути к файлу: ядро CMS, плагин, тема, папка vendor (Composer) или ваш собственный код.

  5. 05

    Проверьте расширения командой `php -m` и сравните со списком, который использовался на старой версии: mysqli, mbstring, curl, gd, xml, intl, zip, а также ionCube Loader, если код закодирован.

  6. 06

    Обновите или замените проблемный плагин, модуль, тему. Если обновления нет, исправьте код или найдите аналог.

  7. 07

    Проверьте проблемную строку командой `php -l имя_файла.php`: она быстро находит синтаксические ошибки, несовместимые с новой версией.

  8. 08

    Прогоните ключевые сценарии: главная, каталог, поиск, корзина и оформление заказа, формы, вход в админку, отправка писем.

  9. 09

    Если за разумное время причина не найдена, верните прежнюю версию PHP и продолжите разбор на тестовой копии.

Типовые правки в коде

Большинство проблем в собственном коде повторяется от проекта к проекту. Это обращения к неопределённым переменным и ключам массива, передача null в строковые функции, вызов count() от значения, которое не является массивом, остатки функций из ветки 5.x и старый синтаксис доступа к символам строки через фигурные скобки.

Отдельно стоит упомянуть изменение сравнения. До PHP 8 выражение `0 == 'abc'` считалось истинным, а теперь даёт false. Если в коде есть проверки вида «если значение равно нулю» над строковыми данными, логика может измениться без единой ошибки в логе. Такие случаи находятся только тестами и вниманием к условиям.

Ниже — пять самых частых правок в формате «было / стало».

было / стало

Пять частых правок при переходе на PHP 8

01
было$first = $str{0};
стало$first = $str[0];
02
было$n = count($items);
стало$n = count($items ?? []);
03
было$len = strlen($title);
стало$len = strlen((string) $title);
04
было$id = $_GET['id'];
стало$id = $_GET['id'] ?? null;
05
былоmysql_query($sql);
сталоmysqli_query($link, $sql);

Плагины, темы, Composer и расширения

Если ошибка указывает на файл в папке плагинов, модулей или vendor, править чужой код напрямую — плохая идея: при следующем обновлении правки пропадут. Правильный порядок такой: проверить, есть ли у разработчика версия с поддержкой вашей PHP, обновить её, а если разработка заброшена — подобрать замену.

Для проектов на Composer важно запускать установку зависимостей именно на целевой версии PHP. Сообщение вида «Your Composer dependencies require a PHP version >= 8.1» означает, что файл проверки платформы в vendor фиксирует требования пакетов. Обновите зависимости командой `composer update` на тестовой копии и убедитесь, что все пакеты поддерживают нужную версию.

Отдельно проверьте закодированные продукты. Скрипты, защищённые ionCube или Zend Guard, привязаны к конкретной версии загрузчика. Если для новой версии PHP нужного загрузчика нет, продукт придётся обновить у вендора.

Типичная ошибка: обновление «вслепую» на рабочем сайте

Самый дорогой сценарий — сменить версию PHP в панели в разгар рабочего дня, не сделав копию и не зная, как откатиться.

Как делают часто

  • Переключают версию PHP на боевом сайте в часы пиковой нагрузки.
  • Не делают резервную копию файлов и базы данных.
  • Включают display_errors на рабочем сайте и показывают посетителям пути к файлам и фрагменты кода.
  • Прячут проблему через error_reporting(0) и не читают логи.

Как правильно

  1. 01

    Создайте тестовую копию сайта и обновите PHP сначала на ней.

  2. 02

    Сделайте полный бэкап файлов и базы и проверьте, что он восстанавливается.

  3. 03

    Держите display_errors выключенным, а логирование включённым.

  4. 04

    Проводите работы в период минимальной нагрузки и заранее продумайте откат на прежнюю версию.

Тестовая среда и план отката

Тестовая копия не обязана быть сложной. Достаточно поддомена с копией файлов и базы данных, закрытого от индексации паролем или директивой noindex, и той же конфигурации PHP, что планируется на рабочем сайте. На этой копии можно спокойно поменять версию, прочитать логи и пройти по основным сценариям.

План отката — это одно предложение, записанное заранее: «если за 30 минут не нашли причину, возвращаем версию X и работаем на копии». Он снимает панику и защищает от попыток чинить сайт под давлением, когда заказы не поступают.

Перед самим обновлением удобно пройтись по короткому чек-листу.

чек-лист

Перед обновлением PHP

  • 01

    Резервная копия файлов и базы данных, проверенная на восстановление.

  • 02

    Список расширений текущей версии (php -m) и копия php.ini.

  • 03

    Требования CMS, темы и каждого плагина к версии PHP.

  • 04

    Прогон на тестовой копии с включённым логированием E_ALL.

  • 05

    Окно работ в период минимальной нагрузки и заготовка страницы с кодом 503.

  • 06

    Записанный план отката: кто, когда и на какую версию возвращает сайт.

Как ошибки PHP влияют на поисковое продвижение

Для поисковых систем сбой после обновления — это в первую очередь серверные ошибки 5xx. Если роботы Яндекса и Google несколько раз подряд получают 500 или 502 вместо страниц, они снижают частоту обхода, а при длительном простое часть страниц может временно выпасть из выдачи.

Поэтому после любого обновления проверьте отчёты: в Яндекс Вебмастере — раздел диагностики сайта и статистику обхода, в Google Search Console — отчёты об индексировании страниц и статистику сканирования. Рост числа ответов 5xx или ошибок доступности — повод срочно вернуться к логам.

Смотрите и на поведение посетителей. В Яндекс Метрике и Google Analytics сравните конверсии и достижение целей до и после обновления: сломанная форма или корзина не даёт ошибок в трафике, но обрушивает заявки и заказы. Если работы плановые и сайт будет недоступен, отдавайте код 503 с заголовком Retry-After: так роботы поймут, что простой временный.

Найти несовместимый код можно до обновления. Статические анализаторы и инструменты вроде PHP_CodeSniffer с набором правил PHPCompatibility, PHPStan и Rector показывают устаревшие и удалённые конструкции в вашем коде и умеют автоматически исправлять часть из них.

Итоги: как пережить обновление PHP без потерь

Ошибки после обновления PHP — это не катастрофа, а предсказуемый набор проблем: удалённые функции, строгие типы, отсутствующие расширения и устаревшие плагины.
  1. 01

    Включите логирование и найдите первую фатальную ошибку, прежде чем что-то менять.

  2. 02

    Проверьте расширения (php -m) и настройки php.ini новой версии.

  3. 03

    Исправляйте код по типовым шаблонам и обновляйте плагины и зависимости.

  4. 04

    Обновляйтесь сначала на тестовой копии, с бэкапом и планом отката.

  5. 05

    После работ проверьте Яндекс Вебмастер, Google Search Console, Яндекс Метрику и Google Analytics.

Чем регулярнее вы обновляете PHP небольшими шагами, тем меньше накапливается проблем и тем спокойнее проходит каждый переход. Если у сайта много самописного кода, устаревшая CMS или он приносит заказы круглосуточно, лучше доверить проверку совместимости специалистам и не экспериментировать на рабочей версии.

Часто задаваемые вопросы

Проверим сайт на совместимость с новой версией PHP до обновления

Найдём несовместимый код и плагины, составим план обновления и отката без простоя сайта

Бесплатная первичная проверкаТест на копии сайтаПлан отката

Тестируем на копии, не на боевом

Политика конфиденциальности

При оставлении заявки на ресурсе «https://gurucontext.ru» пользователи предоставляют следующие сведения:

  • Имя
  • Контактный телефон или Telegram
  • Адрес сайта пользователя (не обязательно)

Также администрация сайта получает данные об IP-адресе посетителей, типе браузера, времени нахождения на сайте и прочие подобные сведения через сервисы статистики.

Использование информации

Вся полученная информация используется администрацией «https://gurucontext.ru» исключительно в целях связи с клиентом.

Защита персональных данных

Компания «https://gurucontext.ru» обязуется не разглашать сведения, полученные от пользователей, и хранит их в защищённом виде.

Предоставление данных третьим лицам

Полученные сведения не передаются третьим лицам, за исключением случаев исполнения обязательств перед клиентом (с его разрешения) и обоснованных требований закона.

Контакты

Телефон: +7 (499) 955-47-00.
E-mail: info@gurucontext.ru.