Диагностика проблемы: почему критические ошибки PHP останавливают работу сайта
Критические ошибки PHP в WordPress приводят к появлению белого экрана смерти (White Screen of Death) или сообщению об ошибке, из-за чего сайт становится недоступен. Это часто происходит при разработке новых функций, установке плагинов или тем, а также при некорректном обновлении кода.
Чтобы понять источник ошибки, необходимо включить режим отладки WordPress. Для этого в wp-config.php добавьте:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);Это позволит записывать ошибки в файл wp-content/debug.log, не показывая их на сайте. Просмотрите этот файл для выявления критических ошибок.
Пошаговое решение: обработка ошибок без остановки сайта
1. Использование конструкции try-catch для перехвата исключений
В PHP с версии 7 можно перехватывать исключения в блоках try-catch. В WordPress это поможет избежать фатальной ошибки, если она возникает в вашем плагине или теме.
try {
// Ваш код, который может вызвать ошибку
some_function_that_might_throw();
} catch (\Throwable $e) {
error_log('Ошибка в my_plugin: ' . $e->getMessage());
// Можно вывести уведомление админу или записать в лог
}Важно: оберните потенциально опасный код в такие блоки, чтобы исключения не приводили к остановке всего сайта.
2. Использование функции set_error_handler для перехвата предупреждений и ошибок
Вы можете зарегистрировать собственный обработчик ошибок, который будет логировать ошибки и не позволит им приводить к фатальной остановке.
set_error_handler(function($errno, $errstr, $errfile, $errline) {
error_log("Ошибка [$errno]: $errstr в $errfile на строке $errline");
// Можно вернуть true, чтобы подавить стандартную обработку
return true;
});<3. Использование плагина Recovery Mode для автоматического восстановления
В WordPress 5.2+ встроен Recovery Mode, который автоматически отправляет письма администраторам при критических ошибках и позволяет войти в безопасный режим. Убедитесь, что эта функция не отключена.
Проверка результата после внедрения
1. Вызовите код, который раньше приводил к фатальной ошибке, например, временно добавьте ошибочный вызов функции в плагин, обернутый в try-catch.
2. Убедитесь, что сайт продолжает работать, а ошибка записывается в wp-content/debug.log или в системный лог.
3. Проверьте, что администраторы получили уведомление, если включен Recovery Mode.
Частые ошибки и как их исправить
- Не обернули весь опасный код: Ошибки вне
try-catchвсе равно вызывают остановку. Решение: аккуратно структурируйте код и обрабатывайте все вызовы, которые могут провалиться. - Отключен WP_DEBUG_LOG или неверные права на файл лога: Ошибки не записываются. Решение: проверьте права на
wp-content/debug.logи настройкуwp-config.php. - Игнорирование ошибок в
set_error_handler: Если функция обработчика возвращаетfalse, ошибки будут обработаны стандартно, что может привести к остановке. Решение: возвращайтеtrue. - Неактивирован Recovery Mode: Нет уведомлений и автоматического восстановления. Решение: не отключайте эту функцию и проверяйте почту администратора.
Практические советы по безопасности и производительности
- В продакшене обязательно отключайте отображение ошибок на сайте (
WP_DEBUG_DISPLAY= false), чтобы не раскрывать структуру кода злоумышленникам. - Используйте логирование ошибок для быстрого реагирования, но следите за размером файла лога.
- Регулярно тестируйте плагины и темы в staging-среде, чтобы исключить ошибки до запуска на боевом сайте.
- Не полагайтесь только на
try-catch, проводите статический анализ кода и качественное тестирование.
Сравнение методов обработки ошибок
| Метод | Описание | Преимущества | Недостатки |
|---|---|---|---|
| try-catch | Перехват исключений в блоках кода | Точный контроль ошибок, предотвращение остановки | Требует оборачивать весь опасный код вручную |
| set_error_handler | Обработка предупреждений и ошибок PHP | Глобальная обработка, удобство логирования | Не перехватывает фатальные ошибки (E_ERROR) |
| Recovery Mode | Встроенный WP режим восстановления при критических ошибках | Автоматическое восстановление, уведомления | Работает только с WP 5.2 и выше, не предотвращает ошибку, а помогает с ней справиться |