#Почему ломается сайт
В новых версиях PHP удалены устаревшие функции и изменены правила: в PHP 7 удалены mysql_*, в PHP 8 ужесточены типы, удалены create_function, each(), изменена работа с null. Старые темы и плагины WordPress, модули Bitrix, самописные скрипты вызывают фатальные ошибки. Симптомы: белый экран, ошибка 500, сообщения Fatal error: Uncaught Error, Call to undefined function.
#Типичные причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Устаревший плагин или темаНе обновлялся годами. | Ошибка указывает на wp-content/plugins. | Обновите или замените. |
| Удалённые функцииmysql_*, each. | Call to undefined function. | Перепишите код. |
| Строгая типизация PHP 8Передача null. | Deprecated/TypeError. | Исправьте вызов. |
| Отсутствует расширениеМодуль PHP не включён. | Class not found. | Включите расширение в панели. |
| Старая CMSВерсия не поддерживает PHP. | Критические ошибки. | Обновите CMS. |
| Неверные настройки php.iniПараметры сбросились. | Лимиты, ошибки загрузки. | Задайте заново. |
#Порядок действий
- Верните прежнюю версию PHP в панели хостинга, чтобы сайт заработалЕсли сайт перестал открываться сразу после переключения PHP, в панели хостинга откройте настройки нужного домена → «PHP», «Версия PHP» или «Обработчик PHP» и верните точную прежнюю версию и режим работы, которые записаны до обновления. Сохраните изменение и проверьте главную, авторизацию и форму отправки. Это временная мера: устаревшую неподдерживаемую версию нельзя оставлять надолго, особенно на публичном сайте.
- Сделайте копию сайта на тестовый поддоменПеред исправлениями создайте резервную копию файлов и базы в панели хостинга; скачайте её и проверьте наличие обоих компонентов. Для проверки новой версии отдельно создайте тестовый сайт (поддомен или закрытое окружение) с копией файлов и БД, изменив конфигурацию подключения именно у копии. Запретите индексацию тестового сайта авторизацией. Не меняйте PHP на основном сайте во время поиска несовместимых расширений.
- Включите вывод и журнал ошибокВ настройках PHP тестового домена найдите «Журнал ошибок» или путь
error_log; при наличии SSH прочитайте свежие строкиtail -n 50 /ПУТЬ/К/error.log, заменив путь реально существующим. В рабочем сайте не включайте публичный вывод ошибок. Для WordPress задавайтеWP_DEBUG_LOGтолько на копии и затем отключайте; файлwp-content/debug.logне должен быть доступен посетителям. Воспроизведите конкретное действие и запишите время ошибки. - Найдите файл и строку ошибкиНайдите в журнале
Fatal error,Parse error,Uncaught ErrorилиCall to undefined functionи полный путь к файлу: часто он указывает на тему или расширение. В редакторе файлов откройте именно этот файл и указанную строку, просмотрите соседние строки. Если есть SSH, сначала проверьте версию PHP веб-сайта отдельно отphp -vв консоли — они могут различаться, — и запускайтеphp -lнужным исполняемым файлом новой версии на копии проекта. - Обновите CMS, темы и плагины до версий, поддерживающих новый PHPНа тестовой копии откройте административную панель CMS → обновления и проверьте минимальную/максимальную версию PHP для текущего выпуска системы, темы и каждого расширения по официальным сведениям разработчика. Создайте полную копию, обновляйте сначала ядро, затем темы и плагины с проверкой сайта после каждого изменения. Если административная панель не открывается, обновление выполняйте средствами хостинга или установщика CMS по официальной процедуре.
- Замените или удалите несовместимые плагиныЕсли ошибка вызвана конкретным плагином, сначала отключите его в панели тестового WordPress через «Плагины → Установленные»; если вход недоступен, временно переименуйте только его каталог в
wp-content/pluginsчерез файловый менеджер. Затем повторите действие и убедитесь, что ошибка исчезла. Подберите поддерживаемую замену, а не удаляйте весь каталог плагинов без копии и плана возврата. - Проверьте код на совместимость инструментом PHPCompatibilityДля собственного кода на тестовой копии сравните используемые конструкции с примечаниями о несовместимости в руководстве PHP. При наличии Composer устанавливайте анализатор PHPCompatibility в каталог отдельного проекта, следуя официальной инструкции инструмента: устаревшие команды установки могут не работать. Результаты статической проверки — подсказки, их надо сверять с журналом и фактической версией PHP, а не менять код механически.
- Переключите версию PHP и протестируйтеПосле исправления ошибок в тестовой копии переключите её на новую PHP и пройдите контрольный набор: главная, вход, загрузка изображения, формы, отправка письма и обновление материалов. Зафиксируйте результат и окно отката. Лишь затем сделайте свежую копию рабочего сайта, переключите рабочую версию и повторите проверки. При появлении ошибки верните прежнюю настройку и исправляйте проблему снова на копии.
- Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Как вернуть работу быстро
В панели хостинга (ISPmanager: «WWW-домены → PHP», cPanel: «MultiPHP Manager») выберите прежнюю версию PHP для домена. Через минуту сайт заработает на старом PHP. Затем планомерно обновляйте компоненты. Не оставляйте старую версию PHP надолго: она перестаёт получать обновления безопасности. Версии с поддержкой уточняйте на https://www.php.net/supported-versions.php .
#Если плагин нельзя обновить
Иногда нужный плагин давно не поддерживается. В WordPress найдите его замену в каталоге https://wordpress.org/plugins/ и сравните по дате последнего обновления и версии «Tested up to». Если замены нет, можно оставить сайт на старой версии PHP в изолированном окружении, но тогда отключите административный раздел от интернета и обновляйте ядро. Для самописного кода запустите автоматическую правку с помощью Rector (composer require rector/rector --dev, затем vendor/bin/rector process src --dry-run), который преобразует часть устаревших конструкций.
Перед включением новой версии убедитесь, что включены нужные расширения (php -m) и что memory_limit и max_execution_time не сбросились. Эти значения хранятся отдельно для каждой версии PHP на хостинге, и после переключения их часто нужно задать заново.