В PHP обработка ошибок по умолчанию проста. В браузер отправляется сообщение об ошибке с именем файла, номером строки и сообщением, описывающим ошибку.
Обработка ошибок — важная часть при создании сценариев и веб-приложений. Если в вашем коде отсутствует код обнаружения ошибок, программа будет выглядеть непрофессионально и откроет дверь для угроз безопасности.
В этом руководстве представлены некоторые из наиболее важных методов обнаружения ошибок в PHP.
Мы объясним вам различные методы обработки ошибок:
Простой оператор «die()»
Пользовательские ошибки и триггеры ошибок
отчет об ошибке
В первом примере показан простой скрипт, открывающий текстовый файл:
<?php$file=fopen("welcome.txt","r");?>
Если файл не существует, вы получите такую ошибку:
Предупреждение: fopen(welcome.txt) [function.fopen]: не удалось открыть поток: в строке 2 нет такого файла или каталога в /www/codercto/test/test.php.
Чтобы пользователи не получали сообщения об ошибках, подобные приведенному выше, мы проверяем, существует ли файл, прежде чем получить к нему доступ:
<?phpif(!file_exists("welcome.txt")){ die("Файл не существует");}else{ $file=fopen("welcome.txt","r");}?>
Теперь, если файл не существует, вы получите следующее сообщение об ошибке:
Файл не существует
Приведенный выше код более эффективен, чем предыдущий, поскольку он использует простой механизм обработки ошибок для завершения сценария после ошибки.
Однако простое завершение сценария не всегда целесообразно. Давайте рассмотрим альтернативные функции PHP для обработки ошибок.
Создать собственный обработчик ошибок очень просто. Мы просто создали специальную функцию, которую можно вызывать при возникновении ошибки в PHP.
Функция должна иметь возможность обрабатывать как минимум два параметра (уровень ошибки и сообщение об ошибке), но может принимать до пяти параметров (необязательно: файл, номер строки и контекст ошибки):
функция_ошибки(уровень_ошибки,сообщение_ошибки,файл_ошибки,строка_ошибки,контекст_ошибки)
параметр | описывать |
---|---|
уровень_ошибки | Необходимый. Указывает уровень отчетов об ошибках, определяемых пользователем. Должно быть число. См. таблицу ниже: Уровни отчетов об ошибках. |
error_message | Необходимый. Указывает сообщения об ошибках, определяемых пользователем. |
файл_ошибки | Необязательный. Указывает имя файла, в котором произошла ошибка. |
error_line | Необязательный. Указывает номер строки, в которой произошла ошибка. |
error_context | Необязательный. Задает массив, содержащий каждую переменную, использовавшуюся в момент возникновения ошибки, и их значения. |
Эти уровни отчетов об ошибках представляют собой различные типы ошибок, обрабатываемые определяемыми пользователем обработчиками ошибок:
ценить | постоянный | описывать |
---|---|---|
2 | Э_ПРЕДУПРЕЖДЕНИЕ | Нефатальная ошибка времени выполнения. Не приостанавливайте выполнение скрипта. |
8 | Э_УВЕДОМЛЕНИЕ | уведомления во время выполнения. Происходит, когда сценарий обнаруживает возможную ошибку, но может возникнуть и при нормальной работе сценария. |
256 | E_USER_ERROR | Неустранимая ошибка пользователя. Это похоже на E_ERROR, установленное программистом с помощью функции PHP триггер_error(). |
512 | E_USER_WARNING | Нефатальное предупреждение, созданное пользователем. Это похоже на E_WARNING, установленное программистом с помощью функции PHP триггер_error(). |
1024 | E_USER_NOTICE | Уведомления, генерируемые пользователем. Это похоже на E_NOTICE, установленное программистом с помощью функции PHP триггер_error(). |
4096 | E_RECOVERABLE_ERROR | Улавливаемые фатальные ошибки. Подобно E_ERROR, но может быть перехвачен пользовательскими обработчиками. (См. set_error_handler()) |
8191 | Е_ВСЕ | Все ошибки и предупреждения. (В PHP 5.4 E_STRICT становится частью E_ALL) |
Теперь давайте создадим функцию, которая обрабатывает ошибки:
function customError($errno, $errstr){ echo "<b>Ошибка:</b> [$errno] $errstr<br>"; echo "Конец скрипта";}
Приведенный выше код представляет собой простую функцию обработки ошибок. При его срабатывании он получает уровень ошибки и сообщение об ошибке. Затем он печатает уровень ошибки и сообщение и завершает выполнение сценария.
Теперь, когда мы создали функцию обработки ошибок, нам нужно определить, когда ее запускать.
Обработчик ошибок PHP по умолчанию — это встроенный обработчик ошибок. Мы собираемся преобразовать указанную выше функцию в обработчик ошибок по умолчанию при запуске скрипта.
Обработчики ошибок можно изменить так, чтобы они применялись только к определенным ошибкам, чтобы сценарий мог обрабатывать разные ошибки по-разному. Однако в этом случае мы собираемся использовать наш собственный обработчик ошибок для всех ошибок:
set_error_handler("customError");
Поскольку мы хотим, чтобы наша пользовательская функция обрабатывала все ошибки, set_error_handler() требует только один аргумент, а второй аргумент можно добавить для указания уровня ошибки.
Проверьте этот обработчик ошибок, попытавшись напечатать несуществующую переменную:
<?php// Функция обработки ошибок function customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr";}// Устанавливаем функцию обработки ошибок set_error_handler("customError") ;//Вызов ошибки echo($test);?>
Вывод приведенного выше кода выглядит следующим образом:
Ошибка: [8] Неопределенная переменная: тест
Когда пользователь вводит данные в сценарий, полезно вызвать ошибку, если введенные пользователем данные недействительны. В PHP эту задачу выполняет функция триггер_error().
В этом примере, если переменная «test» больше «1», возникает ошибка:
<?php$test=2;if ($test>1){ триггер_error("Значение переменной должно быть меньше или равно 1");}?>
Вывод приведенного выше кода выглядит следующим образом:
Примечание. Значение переменной должно быть меньше или равно 1 в /www/test/codercto.php в строке 5.
Вы можете вызвать ошибку в любом месте сценария, а добавив второй параметр, вы можете указать уровень возникающей ошибки.
Возможные типы ошибок:
E_USER_ERROR — фатальная ошибка времени выполнения, созданная пользователем. Ошибка не может быть исправлена. Выполнение сценария было прервано.
E_USER_WARNING — нефатальное пользовательское предупреждение во время выполнения. Выполнение скрипта не прерывается.
E_USER_NOTICE — по умолчанию. Создаваемые пользователем уведомления во время выполнения. Происходит, когда сценарий обнаруживает возможную ошибку, но может возникнуть и при нормальной работе сценария.
В этом примере, если переменная «test» больше «1», возникает ошибка E_USER_WARNING. Если произойдет E_USER_WARNING, мы воспользуемся нашим собственным обработчиком ошибок и завершим скрипт:
<?php// Функция обработки ошибок function customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr<br>"; echo "Конец скрипта"; ; }//Устанавливаем функцию обработки ошибок set_error_handler("customError",E_USER_WARNING);//Вызываем ошибку $test=2;if ($test>1){ триггер_error("Значение переменной должно быть меньше или равно 1",E_USER_WARNING);}?>
Вывод приведенного выше кода выглядит следующим образом:
Ошибка: [512] Значение переменной должно быть меньше или равно 1. Конец скрипта.
Теперь, когда мы узнали, как создавать собственные ошибки и как их вызывать, давайте посмотрим на регистрацию ошибок.
По умолчанию PHP отправляет журналы ошибок в систему или файл журнала сервера, в зависимости от конфигурации error_log в php.ini. Используя функцию error_log(), вы можете отправлять записи об ошибках в указанный файл или удаленное место назначения.
Отправка себе сообщения об ошибке по электронной почте — хороший способ получить уведомление об указанной ошибке.
В приведенном ниже примере, если произойдет конкретная ошибка, мы отправим электронное письмо с сообщением об ошибке и завершим скрипт:
<?php// Функция обработки ошибок function customError($errno, $errstr){ echo "<b>Ошибка:</b> [$errno] $errstr<br>"; echo "Администратор сайта был уведомлен"; error_log ("Ошибка: [$errno] $errstr",1, "[email protected]", "От: [email protected]");}// Установите функцию обработки ошибок set_error_handler("customError",E_USER_WARNING); // Ошибка триггера $test=2;if ($test>1){ ignore_error("Значение переменной должно быть меньше или равно 1",E_USER_WARNING);} ?>
Вывод приведенного выше кода выглядит следующим образом:
Ошибка: [512] Значение переменной должно быть меньше или равно 1. Администратор сайта уведомлен.
Письмо, полученное с помощью приведенного выше кода, выглядит следующим образом:
Ошибка: [512] Значение переменной должно быть меньше или равно 1.
Этот метод подходит не для всех ошибок. Общие ошибки должны регистрироваться на сервере с использованием системы ведения журнала PHP по умолчанию.