Итак. Все говорят, что «Включение ошибок, которые будут отображаться» на активном сайте, плохо (из-за некоторых проблем с безопасностью).
Теперь мы должны рассмотреть два случая:
Теперь, для случая № 1:
Мы хотим видеть ошибки. Как? Что ж:
ini_set('error_reporting', E_ALL); ini_set('display_errors', 1);
Ничего проще. Также мы можем настроить обработчик ошибок для всех ошибок, кроме Parse и Fatal.
Вместо этого, если дело № 2:
Мы хотели бы иметь возможность деактивировать сообщения:
ini_set('error_reporting', 0); ini_set('display_errors', 0);
И все в порядке. Но как насчет того, чтобы показывать пользователям дружеское сообщение, такое как «Hei man, что-то действительно f ** ked up. Я не уверяю вас, что мы работаем над этим, потому что мы очень ленивы». Вы должны включить ошибки снова и просто использовать функцию set_error_handler()
и надеяться, что не произойдет никаких синтаксических ошибок или фатальных ошибок. Но мой первый вопрос:
Вопрос 1 : Возможно ли избежать ошибок при составлении отчетов об ошибках и создать пользовательскую автономную страницу, которая загружается, когда что-то пойдет не так? Я имею в виду, возможно ли иметь
ini_set('error_reporting', 0);
иini_set('display_errors', 0);
и все еще можете сказать PHP, чтобы загрузить пользовательскую страницу ошибок?
А теперь другое:
Вопрос 2 : Я разработал класс, который с мощью
set_error_handler()
регистрировал ошибки в базе данных. Таким образом, я могу отслеживать попытки взлома и другие интересные вещи. (И да, я всегда уверен, что БД доступна, поскольку мое приложение отключается, если мы не можем подключиться к БД). Стоит ли что-то?
Некоторое время назад я создал небольшую систему, которая перенаправляет вас на страницу с ошибкой при возникновении фатальной ошибки / исключении uncaught. Возможно, с допущением, что каждый запрос обрабатывается одним файлом и заканчивается в этом файле, поэтому, достигнув конца этого файла, я уверен, что все прошло хорошо. С этим условием я настроил функцию для перенаправления на странице ошибки и зарегистрировал ее как функцию выключения – поэтому она будет вызываться в конце всех запросов. Теперь в этой функции я проверяю условия для чистого выключения, и если они выполняются, я ничего не делаю, и вывод очищается в браузере, иначе буфер очищается и отправляется только перенаправление заголовка на страницу ошибки.
Упрощенная версия этого кода:
<?php function redirect_on_error(){ if(!defined('EVERYTHING_WENT_OK')){ ob_end_clean(); header('Location: error.html'); } } register_shutdown_function('redirect_on_error'); ob_start(); include 'some/working/code.php'; echo "Now I'm going to call undefined function or throw something bad"; undefined_function(); throw new Exception('In case undefined function is defined.'); define('EVERYTHING_WENT_OK', TRUE); exit;
Вопрос 1: Возможно ли избежать ошибок при составлении отчетов об ошибках и создать пользовательскую автономную страницу, которая загружается, когда что-то пойдет не так?
К сожалению, я так не думаю, по крайней мере, для фатальных ошибок. Тем не менее, последние версии PHP всегда отправляют ответ 500, когда это происходит, поэтому, в зависимости от веб-сервера, вы можете переписать ответ, если это произойдет. Если ваш реальный сервер, на котором запущен PHP, находится за обратным прокси, это становится тривиальным с Apache.
Вопрос 2: Я разработал класс, который с мощью ошибок set_error_handler () регистрировал ошибки в базе данных.
Конечно, всегда полезно регистрировать ошибки. Вы уже, кажется, знаете ограничения ошибок регистрации в базе данных.