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

У меня есть производственный сервер с коммерческим программным обеспечением, в котором используются устаревшие функции. Мы уже отключили вывод ошибок в php.ini -- display_errors = Off -- поэтому пользователи не видят этих ошибок. Однако мы по-прежнему регистрируем ошибки PHP -- log_errors = On -- для отслеживания проблем.

Проблема: PHP, кажется, игнорирует директиву error_reporting в отношении того, что он в конечном итоге передает в журнал ошибок. Независимо от того, какая комбинация значений введена, запись в файл происходит так, как если бы я был установлен на E_ALL. Следовательно, мой журнал ошибок раздут с уведомлениями об устаревании.

Значение часового пояса по умолчанию установлено в php.ini, поэтому вопросы, связанные с часовым поясом, не имеют значения.

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

Сведения о сервере:

  • Убунту 10.04.2 ЛТС
  • PHP 5.3.2

person Frank Koehl    schedule 11.04.2011    source источник
comment
Просто исправьте устаревший код. утки   -  person Lightness Races in Orbit    schedule 12.04.2011
comment
Ты забавный, забавный человек, Томалак. :П   -  person Frank Koehl    schedule 12.04.2011


Ответы (3)


Когда 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 и VirtualHost; они не переопределяются с помощью .htaccess или ini.set().

Функция error_reporting() эквивалентна вызову ini_set() и подпадает под те же правила.

Итак, я вошел в конфигурацию виртуального хоста для рассматриваемого сайта и добавил следующие строки...

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 & ~E_DEPRECATED. Я получил это значение, создав простой скрипт:

    ini_set("error_reporting", E_ALL & ~E_DEPRECATED);
    echo ini_get("error_reporting");
    

    Если вы хотите игнорировать системные уведомления вместе с предупреждениями об устаревании — error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE — побитовое значение равно 22519.

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

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

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

Опять же, приоритет и порядок операций здесь являются ключевыми. Эти значения заменяют значения, определенные в php.ini, и в то же время не могут быть переопределены другими изменениями в приложении или в .htaccess файлах.

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

person Frank Koehl    schedule 13.04.2011
comment
Спасибо за этот ответ. Однако error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE не работает. phpinfo() выбирает правильное значение (22519). Но мой журнал все еще залит E_DEPRECATED. Любая идея? - person Till; 15.12.2011
comment
@Ты когда-нибудь найдешь ответ? - person Ascherer; 16.04.2013
comment
@Ascherer У меня это тоже не работает .. Пока мне сходит с рук: tail -f /custom/log/file | grep -v "is deprecated occured" - person Daveel; 22.08.2014
comment
Я согласен, это НЕ работает с Apache 2.4. /var/log/apache2/error.log по-прежнему заполнен этими сообщениями. - person Adambean; 06.04.2017

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

Если это правда, вы SOL.


Кстати, если вы используете Cacti, см. здесь. Даже если вы не используете Cacti, я думаю, что это довольно хорошо описывает сценарий.

person Lightness Races in Orbit    schedule 11.04.2011

Вы можете использовать символ @ для подавления предупреждений (если не используется пользовательский обработчик ошибок), например:

@unlink("http://something.bad/");

Or:

@require_once('abc.pphp');

Или даже:

$var = @$_GET['something not set'];

Тем не менее, вы должны использовать его с умом, он может легко вызвать проблемы и усложнить отладку.

person Christian    schedule 11.04.2011
comment
Не используйте @! Используйте настройки отчетов об ошибках PHP, чтобы показать или скрыть предупреждения. При использовании @ нет никаких уведомлений. Используя настройки отчетов об ошибках, вы можете записывать все ошибки в журнал ошибок, не показывая их. Так они не потеряются. - person Markus Müller; 26.11.2016
comment
Во-первых, в моем посте есть довольно заметный отказ от ответственности. Во-вторых, между отключением всех ошибок и сокрытием только одной известной ошибки, которая заполняет журналы, я бы выбрал последний подход. В-третьих ... вы понимаете, что это ответ, который я написал 5 лет назад? С тех пор у нас было 6 основных версий PHP... - person Christian; 26.11.2016
comment
Иногда полезно использовать @, особенно для операций с файлами, когда команда может завершиться ошибкой, независимо от того, насколько она упреждающая. Например, можно использовать file_exists для проверки файла перед использованием file_get_contents, но файл может быть удален другим сеансом между ними, поэтому выдается E_WARNING. - person Patanjali; 14.02.2020