#php #error-log
#php #журнал ошибок
Вопрос:
У меня есть производственный сервер, на котором запущено коммерческое программное обеспечение, использующее устаревшую функциональность. Мы уже отключили вывод ошибок в php.ini — display_errors = Off
— поэтому пользователи не видят эти ошибки. Однако мы все еще регистрируем ошибки PHP — log_errors = On
— для отслеживания проблем.
Проблема: PHP, похоже, игнорирует error_reporting
директиву в отношении того, что она в конечном итоге передает в журнал ошибок. Независимо от того, какая комбинация значений введена, запись в файл происходит так, как будто для меня установлено значение E_ALL
. Следовательно, мой журнал ошибок переполнен уведомлениями об устаревании.
В php.ini задано значение часового пояса по умолчанию, поэтому проблемы, связанные с часовым поясом, не имеют значения.
Обновления для программного пакета пока недоступны, поэтому, пожалуйста, никаких рекомендаций «просто исправьте устаревший код». Я специально ищу способы предотвратить сброс PHP устаревших ошибок в журнал, не отключая полностью ведение журнала файлов.
Сведения о сервере:
- Ubuntu 10.04.2 LTS
- PHP 5.3.2
Комментарии:
1. Просто исправьте устаревший код. утки
2. Ты забавный, забавный человек, Томалак. 😛
Ответ №1:
Когда PHP запускается как модуль Apache, вы можете получить доступ / изменить любой параметр конфигурации, доступный в php.ini
, используя директивы в файлах конфигурации Apache. Эти директивы являются…
php_value
php_flag
php_admin_value
php_admin_flag
Разница между php_*
и php_admin_*
версиями является ключом к этой проблеме. Значения, установленные с помощью php_admin_value
и php_admin_flag
, могут быть установлены только в конфигурациях Apache global и VirtualHost; они не переопределяются .htaccess или ini.set().
error_reporting()
Функция эквивалентна ini_set()
вызову и подпадает под те же правила.
Итак, я зашел в конфигурацию virtualhost для рассматриваемого сайта и добавил следующие строки…
php_admin_value error_reporting 22527
php_admin_value error_log /custom/log/path/php_errors.log
php_admin_flag log_errors On
php_admin_flag display_errors Off
-
Первая строка — это побитовое значение для
error_reporting = E_ALL amp; ~E_DEPRECATED
. Я восстановил это значение, создав простой скрипт:ini_set("error_reporting", E_ALL amp; ~E_DEPRECATED); echo ini_get("error_reporting");
Если вы хотите игнорировать системные уведомления вместе с предупреждениями об устаревании —
error_reporting = E_ALL amp; ~E_DEPRECATED amp; ~E_NOTICE
— побитовое значение равно22519
. -
Вторая строка отправляет все ошибки PHP в пользовательский журнал. По умолчанию PHP будет использовать
syslog
значение, обычно/var/log/apache2/error.log
или что-то подобное. -
Третья строка включает ведение журнала файлов.
-
Последнее отключает отображение ошибок на странице.
Опять же, приоритет и порядок операций здесь являются ключевыми. Эти значения заменяют значения, определенные в php.ini
, и в то же время не могут быть переопределены другими изменениями в приложении или в .htaccess
файлах.
Более подробную информацию об изменении значений конфигурации за пределами php.ini можно найти в документации PHP.
Комментарии:
1. Спасибо за этот ответ. Однако,
error_reporting = E_ALL amp; ~E_DEPRECATED amp; ~E_NOTICE
не работает.phpinfo()
получает правильное значение (22519
). Но мой журнал все еще заполненE_DEPRECATED
. Есть идеи?2. @пока вы когда-нибудь не найдете свой ответ?
3. @Ascherer у меня это тоже не работает.. Пока мне сходит с рук:
tail -f /custom/log/file | grep -v "is deprecated occured"
4. Я согласен, это не работает с Apache 2.4. «/var/log/apache2/error.log» по-прежнему заполнен этими сообщениями.
Ответ №2:
Похоже, что само программное обеспечение может устанавливать уровень ошибки, таким образом переопределяя настройку в php.ini
.
Если это правда, вы SOL.
Кстати, если вы используете Cacti, смотрите здесь. Даже если вы не используете Cacti, я думаю, что это довольно хорошо подводит итог сценарию.
Ответ №3:
Вы можете использовать @
символ для подавления предупреждений (если не используется пользовательский обработчик ошибок), например:
@unlink("http://something.bad/");
Или:
@require_once('abc.pphp');
Или даже:
$var = @$_GET['something not set'];
Тем не менее, вы должны использовать это с умом, это может легко вызвать проблемы и усложнить отладку.
Комментарии:
1. Не используйте @! Используйте настройки отчетов об ошибках PHP, чтобы показывать или скрывать предупреждения. При использовании @ вообще нет уведомления. Используя настройки отчетов об ошибках, вы можете записывать все ошибки в журнал ошибок, не показывая их. Таким образом, они не будут потеряны.
2. Во-первых, в моем посте есть довольно заметный отказ от ответственности. Во-вторых, между отключением всех ошибок и скрытием только одной известной ошибки, которая заполняет журналы, я бы выбрал последний подход. В-третьих… вы понимаете, что это ответ, который я написал 5 лет назад? С тех пор у нас было 6 основных версий PHP…
3. Иногда
@
это полезно, особенно для файловых операций, когда команда может завершиться ошибкой, независимо от того, насколько упреждающей она является. Например, можно использоватьfile_exists
для проверки наличия файла перед использованиемfile_get_contents
, но файл может быть удален другим сеансом между ними, поэтомуE_WARNING
выдается.