Отключить E_DEPRECATED в журнале ошибок php

#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
  
  1. Первая строка — это побитовое значение для 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 .

  2. Вторая строка отправляет все ошибки PHP в пользовательский журнал. По умолчанию PHP будет использовать syslog значение, обычно /var/log/apache2/error.log или что-то подобное.

  3. Третья строка включает ведение журнала файлов.

  4. Последнее отключает отображение ошибок на странице.

Опять же, приоритет и порядок операций здесь являются ключевыми. Эти значения заменяют значения, определенные в 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 выдается.