Avatar ·

Как включить показ всех ошибок и предупреждений PHP на сайте?

Всем привет. Я начинающий PHP-разработчик, пишу свой первый сайт на самописном движке. Столкнулся с проблемой: сайт работает, но иногда выдает белый экран смерти (WSOD) — страница просто пустая, без каких-либо сообщений об ошибках. В логах сервера тоже ничего нет (или я не знаю, где их искать). Я понимаю, что где-то в коде есть синтаксическая ошибка или неопределенная переменная, но не могу понять, где именно. Например, есть такой код: ```php ``` Если $_POST['username'] не передан, я ожидаю увидеть предупреждение (Notice), но вижу только пустую страницу. Я уже пробовал добавить в начало скрипта `error_reporting(E_ALL);` и `ini_set('display_errors', 1);`, но это не помогает. Может быть, я что-то делаю не так? Подскажите, как правильно настроить PHP, чтобы видеть все ошибки, предупреждения и уведомления прямо на экране во время разработки? Какие директивы в php.ini нужно менять? Или может быть есть другие способы, например, через .htaccess? Заранее спасибо за помощь! <<>>

Как включить показ всех ошибок PHP: полное руководство

Проблема, с которой вы столкнулись, очень распространена среди начинающих разработчиков. Белый экран смерти (WSOD) возникает, когда в коде есть фатальная ошибка, но вывод ошибок отключен. Давайте разберем все способы включения отображения ошибок.

1. Включение через сам PHP-код (самый простой способ)

Поместите эти строки в самый верх вашего главного скрипта (например, index.php) до любого другого кода:

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
?>

Обратите внимание на display_startup_errors — это важная директива, которая включает ошибки, возникающие при запуске PHP (например, ошибки парсинга). Без нее вы не увидите синтаксические ошибки.

2. Настройка через php.ini (глобально для всего сервера)

Найдите файл php.ini (обычно находится в /etc/php/ на Linux или в папке с PHP на Windows). Найдите и измените следующие строки:

error_reporting = E_ALL
display_errors = On
display_startup_errors = On

После изменений обязательно перезапустите веб-сервер (Apache или Nginx).

3. Настройка через .htaccess (для Apache)

Если у вас нет доступа к php.ini, можно включить ошибки через файл .htaccess в корне сайта:

php_flag display_errors on
php_flag display_startup_errors on
php_value error_reporting E_ALL

4. Специальные уровни отчетов

Вот основные уровни, которые вам пригодятся:

  • E_ALL — все ошибки, включая уведомления и строгие замечания
  • E_WARNING — только предупреждения
  • E_NOTICE — только уведомления (например, неопределенная переменная)
  • E_ALL & ~E_NOTICE — все, кроме уведомлений (чтобы не засорять вывод)

5. Пример: ваш код с включенными ошибками

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');

$name = $_POST['username']; // Теперь вы увидите: Notice: Undefined index: username
echo "Привет, " . $name;
?>

После включения вы увидите что-то вроде: Notice: Undefined index: username in /path/to/file.php on line 5

6. Важные замечания

  • Не оставляйте display_errors включенным на production-сервере! Это угроза безопасности. Используйте log_errors = On и error_log = /path/to/error.log для записи ошибок в файл.
  • Если после всех манипуляций ошибки не показываются, проверьте, не переопределяет ли ваш фреймворк или CMS эти настройки (например, WordPress или Laravel имеют свои методы обработки ошибок).
  • Для максимальной детализации используйте E_ALL | E_STRICT (в PHP < 5.4) или просто E_ALL (в PHP 5.4+ E_STRICT уже входит в E_ALL).

Теперь вы сможете видеть все ошибки и быстро находить проблемы в коде. Удачи в разработке!

<<>>

Альтернативный подход: использование функции set_error_handler()

Если вам нужно не просто показать ошибки, но и обработать их особым образом (например, отправить в лог или на email), создайте свой обработчик ошибок:

<?php
function customErrorHandler($errno, $errstr, $errfile, $errline) {
    echo "<b>Ошибка:</b> [$errno] $errstr в файле $errfile на строке $errline\n";
    // Дополнительно можно записать в лог
    error_log("Ошибка: [$errno] $errstr в $errfile:$errline");
    return true; // Предотвращаем выполнение стандартного обработчика
}

// Устанавливаем пользовательский обработчик
set_error_handler("customErrorHandler");

// Теперь все ошибки будут проходить через вашу функцию
$name = $_POST['username']; // Будет вызван customErrorHandler
?>

Этот метод особенно полезен, когда вы работаете с чужим кодом или фреймворком, который переопределяет стандартное поведение PHP. Вы также можете комбинировать его с error_reporting(E_ALL) для максимального контроля.