JackShcherbakov
@JackShcherbakov

Почему предупреждения и пользовательские ошибки не попадают в журнал ошибок PHP?

Здравствуйте, коллеги! Недавно столкнулся со следующей проблемой:

Я хочу уведомлять пользователей, если что-то пошло не так. Так вот, если что-то пошло не так, то пользователю вместо обычной странички (которую он ожидал увидеть) будет выдано сообщение о том, что что-то пошло не так и надо попробывать позже.

Набросал вот-такой код:
<style>
	.error_message{
		background-color:blue;
		color:white;
		border: 2px black solid;
	}
</style>
<?
set_error_handler(function($errno, $error_message, $err_file, $errline){
	echo "<div class='error_message'>Произошла ошибка уровня $errno. Попробуйте заглянуть позже.</div>";

  if (($errno == E_USER_ERROR) || ($errno == E_ERROR)) {
    echo "<p>Fatal error. Program ending.</p>";
    exit;
  }

  echo "<hr/>";
});
trigger_error('Trigger function called.', E_USER_NOTICE);
fopen('nofile', 'r');
trigger_error('This computer is beige.', E_USER_WARNING);
include ('nofile');
trigger_error('This computer will self destruct in 15 seconds.', E_USER_ERROR);

?>

Вот конфигурация:
error_reporting = E_ALL 
display_errors = Off
display_startup_errors = On
log_errors = On

Я пытаюсь сделать так, что бы пользователь знал о том, что произошла какая-то ошибка, а саму информацию об ошибке я пытаюсь направить в журнал ошибок. Но почему-то ошибки до журнала не доходят. Если убрать set_exception_handler, то тоже не работает*. В чем дело? Я заметил, что до журнала доходять только фатальные ошибки ( и другие серьезные ошибки, напримера ошибки парсинга). Что я делаю не так и как это исправить? Что я не понимаю?
Вот вывод этого скрипта в браузере (без CSS) :
Произошла ошибка уровня 1024. Попробуйте заглянуть позже.
Произошла ошибка уровня 2. Попробуйте заглянуть позже.
Произошла ошибка уровня 512. Попробуйте заглянуть позже.
Произошла ошибка уровня 2. Попробуйте заглянуть позже.
Произошла ошибка уровня 2. Попробуйте заглянуть позже.
Произошла ошибка уровня 256. Попробуйте заглянуть позже.
Fatal error. Program ending.


Заранее выражаю огромную благодарность всем, кто поможет.
UPD:
*Без set_error_handler работает.
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
JackShcherbakov
@JackShcherbakov Автор вопроса
Проблему с логированием решил путем возвращения false для того, чтобы обработка ошибок перешла обработчику PHP, который и проведет журналирование.
set_error_handler(function($errno, $error_message, $err_file, $errline){
	echo "<div class='error_message'>Произошла ошибка уровня $errno. Попробуйте заглянуть позже.</div>";

  if (($errno == E_USER_ERROR) || ($errno == E_ERROR)) {
    echo "<p>Fatal error. Program ending.</p>";
    exit;
  }

  echo "<hr/>";
  return false;
});

Еще можно и самостоятельно вести лог, но я хочу поручить это дело PHP.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы