Отключить E_DEPRECATED в журнале ошибок 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

Когда 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() и подпадает под одни и те же правила.

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

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

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

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

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

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

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

Более подробную информацию об изменении значений конфигурации за пределами php.ini можно найти в документации по PHP.

Ответ 2

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

Если это так, вы SOL.


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

Ответ 3

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

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

Или:

@require_once('abc.pphp');

Или даже:

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

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