Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код: Skills Начать
Рубрики
VPS Администрация

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

Эффективная отладка PHP приложений может означать разницу между часами разочарования и быстрым, чистым исправлением. Независимо от того, создаете ли вы новое веб-приложение или поддерживаете существующее, знание того, как включить и настроить отчеты об ошибках PHP, является фундаментальным навыком, который необходим каждому разработчику. Это подробное руководство охватывает все доступные методы — от быстрых исправлений в скрипте до конфигурации на уровне сервера — и объясняет, как безопасно обрабатывать отчеты об ошибках как в среде разработки, так и в производстве.

Что такое отчетность об ошибках PHP и почему это важно?

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

По умолчанию многие конфигурации серверов полностью подавляют вывод ошибок, особенно в production-окружении. Это сделано намеренно: отображение необработанных сообщений об ошибках конечным пользователям может раскрыть конфиденциальную информацию, такую как пути к файлам, учетные данные базы данных и внутреннюю логику приложения. Однако во время разработки подавление ошибок делает отладку ненужно сложной.

Понимание того, как включать и отключать отчетность об ошибках — и где ее настраивать — необходимо для любого разработчика, работающего с PHP в окружении VPS Hosting или на общем сервере.

Уровни ошибок PHP с первого взгляда

PHP категоризирует ошибки на отдельные уровни, каждый из которых контролируется независимо:

КонстантаОписание
E_ERRORКритические ошибки выполнения, которые останавливают выполнение скрипта
E_WARNINGНекритические предупреждения во время выполнения
E_NOTICEНезначительные уведомления о потенциальных проблемах в коде
E_DEPRECATEDПредупреждения о функциях, которые будут удалены в будущих версиях PHP
E_PARSEОшибки парсинга во время компиляции
E_ALLВсе ошибки, предупреждения и уведомления вместе

Использование E_ALL во время разработки гарантирует, что вы поймаете каждую возможную проблему до того, как она попадет в production.

Способ 1: Включить отчеты об ошибках PHP непосредственно в вашем скрипте

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

<?php
error_reporting(E_ALL);          // Report all types of errors
ini_set('display_errors', 1);    // Display errors directly in the browser
ini_set('display_startup_errors', 1); // Also show errors during PHP startup
?>

Что делает каждая строка

  • error_reporting(E_ALL) — Устанавливает уровень отчетности об ошибках для захвата всех категорий ошибок, включая уведомления, предупреждения, оповещения об устаревании и критические ошибки. Вы также можете комбинировать определенные константы с помощью побитовых операторов, например E_ALL & ~E_NOTICE для исключения уведомлений.
  • ini_set('display_errors', 1) — Указывает PHP выводить сообщения об ошибках непосредственно в браузер или командную строку. Установка этого значения на 0 скрывает ошибки от вывода без отключения их логирования.
  • ini_set('display_startup_errors', 1) — Включает отчетность об ошибках, которые происходят во время последовательности запуска PHP, что display_errors отдельно не охватывает.

> Важно: Всегда размещайте эти строки в самом начале вашего скрипта. Если критическая ошибка синтаксиса происходит до того, как эти строки будут достигнуты, они не будут иметь никакого эффекта. Для ошибок синтаксиса необходимо вместо этого настроить отчетность об ошибках на уровне php.ini.

Когда использовать этот способ

Этот способ лучше всего подходит для:

  • Быстрой отладки одного скрипта или модуля
  • Сред общего хостинга, где у вас нет доступа к php.ini
  • Временных сеансов отладки во время активной разработки

Способ 2: Включение отчетов об ошибках PHP через php.ini (Рекомендуется)

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

Шаг 1: Найдите ваш файл php.ini

Расположение php.ini зависит от вашей операционной системы, версии PHP и веб-сервера. Самый простой способ найти его — создать временный PHP-файл со следующим содержимым:

<?php
phpinfo();
?>

Загрузите этот файл на ваш сервер, откройте его в браузере и найдите запись "Loaded Configuration File". Это отобразит точный путь к активному файлу php.ini.

Типичные расположения по умолчанию включают:

  • Linux (Apache): /etc/php/8.x/apache2/php.ini
  • Linux (CLI): /etc/php/8.x/cli/php.ini
  • Linux (Nginx + PHP-FPM): /etc/php/8.x/fpm/php.ini
  • Windows (XAMPP): C:xamppphpphp.ini
  • macOS (MAMP): /Applications/MAMP/conf/php/php.ini

> Напоминание о безопасности: Удалите или ограничьте доступ к файлу phpinfo() сразу после использования. Он раскрывает подробные данные конфигурации сервера, которые могут быть использованы в целях эксплуатации.

Шаг 2: Отредактируйте файл php.ini

Откройте файл php.ini с помощью текстового редактора или через SSH на вашем сервере:

sudo nano /etc/php/8.x/apache2/php.ini

Найдите следующие директивы и обновите их, как показано:

До (типичные значения по умолчанию для production):

display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
log_errors = On

После (конфигурация разработки):

display_errors = On
display_startup_errors = On
error_reporting = E_ALL
log_errors = On
error_log = /var/log/php/error.log

Шаг 3: Перезагрузите ваш веб-сервер

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

Для Apache:

sudo systemctl restart apache2

Для Nginx с PHP-FPM:

sudo systemctl restart php8.x-fpm
sudo systemctl restart nginx

Для XAMPP на Windows:

Откройте панель управления XAMPP и нажмите Stop, затем Start рядом с Apache.

Способ 3: Включение отчетов об ошибках через .htaccess (только Apache)

Если вы находитесь в среде общего хостинга без прямого доступа к php.ini, и ваш сервер работает на Apache, вы можете переопределить параметры PHP, используя файл .htaccess в корневом каталоге вашего веб-сайта.

php_flag display_errors On
php_flag display_startup_errors On
php_value error_reporting 32767
php_flag log_errors On
php_value error_log /home/yourusername/logs/php_errors.log

Числовое значение 32767 соответствует E_ALL в PHP. Этот метод особенно полезен на планах Общего веб-хостинга, где доступ к конфигурации на уровне сервера ограничен.

> Примечание: Этот метод работает только если ваш хостер разрешает переопределение директив PHP через .htaccess. Некоторые хосты отключают это по соображениям безопасности.

Способ 4: Настройка отчетов об ошибках в локальных средах разработки

Если вы используете локальный стек разработки, такой как XAMPP, MAMP или WAMP, процесс прост.

XAMPP (Windows / Linux / macOS)

  1. Откройте XAMPP Control Panel
  2. Нажмите Config рядом с Apache
  3. Выберите PHP (php.ini) из раскрывающегося списка
  4. Примените параметры разработки, описанные в Способе 2
  5. Перезагрузите Apache из Control Panel

MAMP (macOS)

  1. Откройте MAMP Preferences
  2. Перейдите на вкладку PHP
  3. Нажмите кнопку php.ini, чтобы открыть файл конфигурации
  4. Примените параметры разработки и сохраните
  5. Перезагрузите серверы MAMP

Среды на основе Docker

Если вы используете Docker для локальной разработки, вы можете передавать значения конфигурации PHP непосредственно через переменные окружения или подключить пользовательский php.ini файл:

RUN echo "display_errors = On" >> /usr/local/etc/php/conf.d/custom.ini
RUN echo "error_reporting = E_ALL" >> /usr/local/etc/php/conf.d/custom.ini

Тестирование конфигурации отчётов об ошибках

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

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

// Intentional error: undefined variable
echo $undefinedVariable;

// Intentional warning: wrong argument count
strlen();

// Intentional notice: undefined array key
$array = [];
echo $array['missing_key'];
?>

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

Notice: Undefined variable: undefinedVariable in /var/www/html/test.php on line 5
Warning: strlen() expects exactly 1 argument, 0 given in /var/www/html/test.php on line 8
Notice: Undefined index: missing_key in /var/www/html/test.php on line 12

Отключение отображения ошибок и логирование ошибок в production

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

  • Абсолютные пути файлов на сервере
  • Имена таблиц базы данных и структуры запросов
  • Версию PHP и детали расширений
  • Логику приложения и данные конфигурации

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

Рекомендуемые параметры production php.ini

display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL
log_errors = On
error_log = /var/log/php/production_errors.log

Обратите внимание, что error_reporting остается установленным на E_ALL даже в production. Это гарантирует, что все ошибки будут записаны в файл журнала для проверки, без раскрытия их посетителям.

Создание и защита файла журнала ошибок

# Create the log directory
sudo mkdir -p /var/log/php

# Create the log file
sudo touch /var/log/php/production_errors.log

# Set appropriate ownership
sudo chown www-data:www-data /var/log/php/production_errors.log

# Restrict permissions
sudo chmod 640 /var/log/php/production_errors.log

Мониторинг журналов ошибок

Вы можете мониторить журнал ошибок PHP в реальном времени, используя команду tail:

tail -f /var/log/php/production_errors.log

Это особенно полезно на Dedicated Server, где у вас есть полный доступ root и вы можете настроить ротацию журналов, оповещения и инструменты мониторинга, такие как Logwatch или Fail2Ban.

PHP Error Reporting: Development vs. Production Settings Summary

ПараметрРазработкаProduction
display_errorsOnOff
display_startup_errorsOnOff
error_reportingE_ALLE_ALL
log_errorsOnOn
error_logОпциональноОбязательно

Advanced: Custom Error Handlers

Для более сложных приложений PHP позволяет определить пользовательскую функцию обработки ошибок с помощью set_error_handler(). Это дает вам полный контроль над тем, как ошибки обрабатываются, форматируются и сохраняются.

<?php
function customErrorHandler(int $errno, string $errstr, string $errfile, int $errline): bool {
    $timestamp = date('Y-m-d H:i:s');
    $message = "[$timestamp] Error $errno: $errstr in $errfile on line $errline" . PHP_EOL;

    // Log to a custom file
    error_log($message, 3, '/var/log/php/custom_errors.log');

    // Optionally display a friendly message to users in production
    if (ini_get('display_errors')) {
        echo "<pre>$message</pre>";
    }

    return true; // Prevent PHP's default error handler from running
}

set_error_handler('customErrorHandler');
?>

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

Выбор правильной среды хостинга для разработки на PHP

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

  • Общий веб-хостинг — Ограниченный доступ к php.ini; полагаться на .htaccess или конфигурацию в скрипте. Лучше всего для небольших проектов.
  • VPS Hosting — Полный root-доступ, полный контроль над php.ini, PHP-FPM пулами и конфигурацией сервера. Идеально для профессиональной разработки на PHP.
  • VPS с cPanel — Сочетает контроль на уровне root с удобством графического интерфейса для управления версиями PHP и параметрами для каждого домена.
  • Выделенные серверы — Максимальная производительность и изоляция; лучше всего для высоконагруженных PHP-приложений со сложными требованиями к логированию и мониторингу.

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

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

Почему мои ошибки PHP не отображаются даже после включения отчетов об ошибках в моем скрипте?

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

Могу ли я включить отчеты об ошибках только для одного каталога?

Да. Поместите файл .htaccess с директивами ошибок PHP в конкретный каталог или используйте файл php.ini для каждого каталога, если ваш сервер это поддерживает.

Замедляет ли включение отчетов об ошибках мое приложение?

Незначительно. Влияние на производительность самого отчета об ошибках минимально. Однако запись в файлы журналов при каждом запросе может добавить небольшие накладные расходы на ввод-вывод в высоконагруженных окружениях.

В чем разница между display_errors и log_errors?

display_errors отправляет вывод ошибок в браузер или командную строку. log_errors записывает ошибки в файл. В production всегда используйте log_errors = On с display_errors = Off.

Заключение

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

Ключевые выводы из этого руководства:

  1. Используйте error_reporting(E_ALL) и ini_set('display_errors', 1) для быстрой отладки отдельных скриптов
  2. Измените php.ini для постоянной отчетности об ошибках на уровне сервера в средах разработки
  3. Используйте .htaccess когда у вас нет прямого доступа к php.ini на общем хостинге
  4. Всегда отключайте display_errors в production и перенаправляйте вывод ошибок в защищенный файл журнала
  5. Рассмотрите пользовательский обработчик ошибок для расширенного логирования, мониторинга и удобных для пользователя страниц ошибок

Выбор правильной среды хостинга также имеет значение. Выбираете ли вы Общий веб-хостинг для простого проекта или полностью управляемый план VPS Hosting для профессионального PHP приложения, наличие надлежащего уровня доступа к серверу гарантирует, что вы можете настроить отчетность об ошибках именно так, как требует ваш проект.

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