Отключить E_DEPRECATED в журнале ошибок php - PullRequest
14 голосов
/ 12 апреля 2011

У меня есть рабочий сервер, на котором запущено коммерческое программное обеспечение, которое использует устаревшие функции. Мы уже отключили вывод ошибок в 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

Ответы [ 3 ]

24 голосов
/ 13 апреля 2011

Когда 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 .

2 голосов
/ 12 апреля 2011

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

Если это правда, то вы СОЛ.


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

0 голосов
/ 12 апреля 2011

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

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

Или:

@require_once('abc.pphp');

Или даже:

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

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

...