Подавление ошибок за пределы настройки ERROR_REPORTING (возможно, display_errors?)

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

В некоторых случаях этот сайт зависел от внешних каналов XML-файлов, которых больше нет, но код не был должным образом настроен для предоставления красивого чистого сообщения об ошибке (существуют различные подобные обстоятельства) - клиент запрашивает это по адресу по крайней мере, эти сообщения об ошибках исчезают, даже если, например, содержимое файла xml не публикуется, поэтому мы не увидим ошибок php и пустой области на странице (так что остальная часть страницы может выглядеть "нормально").

В какой-то момент я слышал о ком-то, кто использовал set_error_handler, чтобы аннулировать некоторые случаи, когда это не является экстремальным, и у меня была идея настроить его так, чтобы он сохранял сообщения об ошибках в файле / журнале или отправлял их по электронной почте (и пытался избежать дублирования сообщений об ошибках) в основном, так что конечные пользователи не должны видеть эти ужасные вещи.

Я ищу советы от тех, кто на самом деле это сделал, так что спасибо заранее.

2 ответа

Решение

Когда в разработке, это хорошо использовать

error_reporting(E_ALL);
ini_set('display_errors', 'On');

Таким образом, вы можете сразу увидеть ошибки: это помогает их исправить.


На рабочем сервере вы не хотите отображать ошибку, поэтому:

ini_set('display_errors', 'Off');

error_reporting может оставаться активным: если display_errors выключено, ошибки все равно не будут отображаться, но вы все равно можете записать их в файл.


Кстати, их можно установить в файле php.ini, конечно:

  • error_reporting
  • display_errors


На производственной машине вы можете использовать log_errors а также error_log, поэтому ошибки записываются в файл (это означает, что вы сможете узнать, какие ошибки произошли - иногда это может быть полезно); конечно, не забывайте время от времени проверять этот файл;-).


Как примечание: если у вас есть пара функций / методов, которые вы не хотите отображать ошибки, вы можете предусмотреть использование оператора @, чтобы просто маскировать ошибки, которые могут вызвать...

... Но я настоятельно советую против этого (за исключением очень специфических случаев): это усложняет отладку: ошибки, возникающие там, никогда не отображаются, даже на вашей машине для разработки!

На мой взгляд, лучше просто отключить display_errors на производственной машине; это также означает, что ошибки не будут отображаться вообще, что лучше для пользователей!

На вашем рабочем сервере должны быть следующие настройки ini:

ini_set('error_reporting', E_ALL | E_STRICT);
ini_set('log_errors', true);
ini_set('error_log', '/tmp/php_errors.log'); // or whatever file is appropriate
ini_set('display_errors', false);

Выключая display_errorsВаши пользователи никогда не увидят другое сообщение об ошибке, но вы сможете увидеть сообщения об ошибках, посмотрев в файл журнала.

Когда перекодирование закончено, больше не должно быть ошибок в файле журнала (потому что вы исправили их все).

Изменить: некоторые разработчики установили error_reporting в E_ALL ^ E_NOTICE как способ сокрытия ошибок. Это плохая практика, потому что она скрывает сообщения о возможных ошибках программирования. Вы должны использовать только E_ALL ^ E_NOTICE когда из унаследованного кода приходит так много уведомлений, что вы не можете исправить их все.

Другие вопросы по тегам