Вывод ошибки PHP в браузер
Обновлено: 21.11.2024
Обработка ошибок в PHP проста. В браузер отправляется сообщение об ошибке с именем файла, номером строки и сообщением с описанием ошибки.
Обработка ошибок PHP
При создании сценариев и веб-приложений важной частью является обработка ошибок. Если в вашем коде отсутствует код проверки ошибок, ваша программа может выглядеть очень непрофессионально, и вы можете быть подвержены угрозам безопасности.
Это руководство содержит некоторые из наиболее распространенных методов проверки ошибок в PHP.
Мы покажем различные методы обработки ошибок:
- Простые операторы die()
- Пользовательские ошибки и триггеры ошибок
- Отчеты об ошибках
Основная обработка ошибок: использование функции die()
В первом примере показан простой скрипт, открывающий текстовый файл:
Пример
Если файл не существует, вы можете получить следующее сообщение об ошибке:
Предупреждение: fopen(mytestfile.txt) [function.fopen]: не удалось открыть поток:
Нет такого файла или каталога в C:\webfolder\test.php в строке 2
Чтобы пользователь не получил сообщение об ошибке, подобное приведенному выше, мы проверяем, существует ли файл, прежде чем пытаться получить к нему доступ:
Пример
Теперь, если файл не существует, вы получите следующее сообщение об ошибке:
Приведенный выше код более эффективен, чем предыдущий, поскольку он использует простой механизм обработки ошибок для остановки скрипта после возникновения ошибки.
Однако простая остановка скрипта не всегда является правильным решением. Давайте рассмотрим альтернативные функции PHP для обработки ошибок.
Создание собственного обработчика ошибок
Создать собственный обработчик ошибок очень просто. Мы просто создаем специальную функцию, которую можно вызвать при возникновении ошибки в PHP.
Эта функция должна обрабатывать как минимум два параметра (уровень ошибки и сообщение об ошибке), но может принимать до пяти параметров (необязательно: файл, номер строки и контекст ошибки):
Синтаксис
Параметр | Описание |
---|---|
error_level< /td> | Обязательный. Задает уровень отчета об ошибке для определяемой пользователем ошибки. Должно быть числовое значение. См. таблицу ниже для возможных уровней отчетов об ошибках |
error_message | Обязательно. Указывает сообщение об ошибке для определяемой пользователем ошибки |
файл_ошибки | Необязательно. Указывает имя файла, в котором произошла ошибка |
error_line | Необязательно. Указывает номер строки, в которой произошла ошибка |
error_context | Необязательно. Определяет массив, содержащий все переменные и их значения, используемые при возникновении ошибки |
Уровни отчетов об ошибках
Эти уровни отчетов об ошибках представляют собой различные типы ошибок, для которых может использоваться определяемый пользователем обработчик ошибок:
Значение | Константа | Описание |
---|---|---|
1 | E_ERROR | Неустранимая ошибка времени выполнения. Выполнение скрипта остановлено |
2 | E_WARNING | Нефатальная ошибка времени выполнения. Выполнение скрипта не остановлено |
8 | E_NOTICE | Уведомление во время выполнения. Скрипт обнаружил что-то, что может быть ошибкой, но также может произойти при нормальном запуске скрипта |
256 | E_USER_ERROR | A фатальная пользовательская ошибка. Это похоже на E_ERROR, за исключением того, что оно генерируется сценарием PHP с использованием функции trigger_error() |
512 | E_USER_WARNING | Нефатальное пользовательское предупреждение. Это похоже на E_WARNING, за исключением того, что оно генерируется сценарием PHP с использованием функции trigger_error() |
1024 | E_USER_NOTICE | Уведомление, созданное пользователем. Это похоже на E_NOTICE, за исключением того, что оно генерируется сценарием PHP с использованием функции trigger_error() |
2048 | E_STRICT | Строго не ошибка. |
8191 | E_ALL | Все ошибки и предупреждения (E_STRICT стал частью E_ALL в PHP 5.4) |
Теперь давайте создадим функцию для обработки ошибок:
Приведенный выше код представляет собой простую функцию обработки ошибок. Когда он срабатывает, он получает уровень ошибки и сообщение об ошибке. Затем он выводит уровень ошибки и сообщение и завершает скрипт.
Теперь, когда мы создали функцию обработки ошибок, нам нужно решить, когда она должна запускаться.
Установить обработчик ошибок
Обработчик ошибок по умолчанию для PHP — это встроенный обработчик ошибок. Мы собираемся сделать функцию над обработчиком ошибок по умолчанию на время работы скрипта.
Можно изменить обработчик ошибок, чтобы он применялся только к некоторым ошибкам, чтобы сценарий мог обрабатывать разные ошибки по-разному. Однако в этом примере мы собираемся использовать наш собственный обработчик ошибок для всех ошибок:
Поскольку мы хотим, чтобы наша пользовательская функция обрабатывала все ошибки, set_error_handler() требовался только один параметр, второй параметр можно было добавить, чтобы указать уровень ошибки.
Пример
Проверка обработчика ошибок путем попытки вывести несуществующую переменную:
Вывод приведенного выше кода должен быть примерно таким:
Вызвать ошибку
В сценарии, где пользователи могут вводить данные, полезно вызывать ошибки, когда происходит недопустимый ввод. В PHP это делается с помощью функции trigger_error().
Пример
В этом примере возникает ошибка, если переменная "test" больше "1":
Вывод приведенного выше кода должен быть примерно таким:
Ошибка может быть вызвана в любом месте скрипта, и, добавив второй параметр, вы можете указать, какой уровень ошибки вызывается.
Возможные типы ошибок:
- E_USER_ERROR – неустранимая ошибка времени выполнения, созданная пользователем. Ошибки, от которых невозможно избавиться. Выполнение скрипта остановлено
- E_USER_WARNING — нефатальное предупреждение, создаваемое пользователем во время выполнения. Выполнение скрипта не останавливается
- E_USER_NOTICE — по умолчанию. Пользовательское уведомление во время выполнения. Скрипт обнаружил что-то, что может быть ошибкой, но также может произойти при нормальном запуске скрипта
Пример
В этом примере E_USER_WARNING возникает, если переменная "test" больше "1". Если возникает E_USER_WARNING, мы используем наш собственный обработчик ошибок и завершаем скрипт:
Вывод приведенного выше кода должен быть примерно таким:
Теперь, когда мы узнали, как создавать собственные ошибки и как их вызывать, давайте взглянем на регистрацию ошибок.
Журнал ошибок
По умолчанию PHP отправляет журнал ошибок в систему ведения журналов сервера или в файл, в зависимости от того, как настроена конфигурация error_log в файле php.ini. С помощью функции error_log() вы можете отправлять журналы ошибок в указанный файл или в удаленный пункт назначения.
Отправка сообщений об ошибках самому себе по электронной почте может быть хорошим способом получать уведомления о конкретных ошибках.
Отправить сообщение об ошибке по электронной почте
В приведенном ниже примере мы отправим электронное письмо с сообщением об ошибке и завершим скрипт, если произойдет конкретная ошибка:
Вывод приведенного выше кода должен быть примерно таким:
И почта, полученная из приведенного выше кода, выглядит так:
Это не следует использовать для всех ошибок. Регулярные ошибки должны регистрироваться на сервере с использованием системы ведения журнала PHP по умолчанию.
Я проверил свой файл PHP ini ( php.ini ) и установил display_errors , а также отчет об ошибках E_ALL . Я перезапустил веб-сервер Apache.
Я даже поместил эти строки в начало своего скрипта, и он даже не отлавливает простые ошибки синтаксического анализа. Например, я объявляю переменные с помощью "$" и не закрываю операторы ";" . Но все мои скрипты показывают пустую страницу с этими ошибками, но я хочу видеть ошибки в выводе моего браузера.
Что осталось сделать?
Мне еще предстоит точно определить, почему это работает иногда, а не иначе, но для тех, кто хочет быстро переключать ошибки в php-скрипте (или включать их с помощью параметра $_REQUEST), эти две строки будут работать большую часть времени. .
31 Ответ 31
Это всегда работает для меня:
Однако это не заставляет PHP отображать ошибки синтаксического анализа — единственный способ показать эти ошибки — изменить файл php.ini с помощью этой строки:
(если у вас нет доступа к php.ini , может также сработать эта строка в .htaccess):
Также обратите внимание, что вы можете использовать эти 3 строки, а затем включить('fileImWorkingOn.php');. Тогда вы сможете поймать и синтаксические ошибки!
Хотя я не SysOps, я думаю, что у большего количества людей есть файл .htaccess, чем php.ini, и они оба будут перед синтаксическим анализом, верно? php_flag display_errors 1 для .htaccess
E_ALL недостаточно для отображения всех ошибок в PHP 5.3. " E_STRICT стал частью E_ALL в 5.4.0" - Руководство по PHP Вам нужен E_ALL | E_STRICT или -1 в этой версии.
Вы не можете перехватывать ошибки синтаксического анализа при включении вывода ошибок во время выполнения, потому что он анализирует файл перед фактическим выполнением чего-либо (и поскольку во время этого возникает ошибка, он ничего не выполняет). Вам потребуется изменить фактическую конфигурацию сервера, чтобы включить display_errors и использовать соответствующий уровень error_reporting. Если у вас нет доступа к php.ini, вы можете использовать .htaccess или аналогичный, в зависимости от сервера.
В этом вопросе может содержаться дополнительная информация.
Внутри вашего php.ini:
Затем перезапустите веб-сервер.
забавный факт: вы можете найти файл php.ini загружается, если вы просто вводите phpinfo(); в пустой файл php. это 7-я строка вниз и называется загруженным файлом конфигурации
Мне это не подходит. На самом деле я могу вызвать ini_get('display_errors'), и он вернет пустую строку (что означает, что он отключен). И да, я проверил, чтобы убедиться, что это единственная строка в файле конфигурации. Настройка каким-то образом переопределяется, и я не могу понять, почему, и это сводит меня с ума. Да, я искал все в /etc/php.d/, и это тоже не один из этих файлов. Да, я тоже перезапустил веб-сервер. Нет, в файле .htaccess ничего нет. Я использую PHP 7.4.6.
Чтобы отобразить все ошибки, вам необходимо:
<р>1. Имейте эти строки в скрипте PHP, который вы вызываете из браузера (обычно index.php ):2.(a) Убедитесь, что в этом скрипте нет синтаксических ошибок
2.(b) Установите display_errors = On в файле php.ini
Иначе он не сможет запустить даже эти две строки!
Вы можете проверить наличие синтаксических ошибок в своем скрипте, запустив (в командной строке):
Если вы включите скрипт из другого скрипта PHP, он будет отображать синтаксические ошибки в включенном скрипте. Например:
index.php
my_script.php
Все, что я получаю при выполнении php -l phpfilename.php, это сообщение "Ошибки синтаксического анализа sql_lab.php". Он не говорит мне, что это за ошибки.
В дополнение к пустому экрану он вернет ошибку 500, которую гораздо безопаснее измерить, чем просто отсутствие контента.
Некоторые хостинг-провайдеры позволяют изменять параметры PHP в файле .htaccess.
Вы можете добавить следующую строку:
У меня была та же проблема, что и у вас, и это решение решило ее.
Если вы работаете в среде nginx, добавьте значение php в конфигурацию вашего сайта (сайты доступны) в директиве location ~\.php. fastcgi_param PHP_VALUE " error_reporting=E_ALL;\n display_errors=1;";
Вы можете обнаружить, что все настройки для "отчетов об ошибках" или "отображения ошибок" не работают в PHP 7. Это связано с тем, что обработка ошибок изменилась. Вместо этого попробуйте следующее:
Или, чтобы перехватывать исключения и ошибки за один раз (это не имеет обратной совместимости с PHP 5):
Вы имеете в виду PHP7 или PHP7.1? Я в замешательстве, я попробовал предложенный проверенный ответ, и он работает, я думаю, вы предлагаете что-то немного другое ИМХО, действительно «без обратной совместимости», и если вам нужно изменить полный код PHP try<> catch() <> везде в вашем уже определенном php-коде, я даже не хочу думать о беспорядке, который будет..
@ballangddang, я столкнулся с проблемой в PHP 7.0, где единственным способом отображения ошибки было использование блоков try/catch и, в частности, перехват Error . Если вы переписываете все запросы (кроме, может быть, JavaScript, CSS, изображений и т. д.) в файл index.php, то держите там блок try catch, это упрощает задачу. Да, любая система, не имеющая единой точки входа, будет серьезной головной болью при обновлении.
Должны отображаться необработанные исключения. Если вы включите выходной буфер в начале (чтобы вы могли отправлять заголовки в любой момент, прежде чем окончательно очистить тело ответа), возможно, сообщение об исключении может где-то потеряться.
Октябрь 2020 г. Мне это помогло. Так легко. Не возитесь с .htaccess или php.ini. Когда вы закончите, просто закомментируйте или удалите его. PHP 7.4
Это лучший способ написать его, но синтаксическая ошибка приводит к пустому выводу, поэтому используйте консоль для проверки синтаксических ошибок. Лучший способ отлаживать PHP-код — использовать консоль; выполните следующее:
Установите это в файле index.php:
Создайте файл с именем php.ini в папке, где находится ваш файл PHP.
Внутри php.ini добавьте следующий код (я даю простую ошибку, показывающую код):
Поскольку сейчас мы используем PHP 7, приведенные здесь ответы больше неверны. Единственное, что все еще в порядке, это от Фрэнка Форте, когда он говорит о PHP 7.
С другой стороны, вместо того, чтобы пытаться отловить ошибки с помощью try/catch, вы можете использовать хитрость: используйте include.
Вот три фрагмента кода:
Выполнение этого в PHP 7 ничего не покажет.
Теперь запустите tst2, который устанавливает отчет об ошибках, а затем включите tst3. Вы увидите:
Обычно я использовал следующий код в своих простых PHP-проектах.
Если, несмотря на выполнение всех приведенных выше ответов (или вы не можете редактировать файл php.ini), вы по-прежнему не можете получить сообщение об ошибке, попробуйте создать новый файл PHP, который включает отчеты об ошибках, а затем включите проблемный файл. например:
Несмотря на то, что в моем файле php.ini все было правильно настроено, это был единственный способ обнаружить ошибку пространства имен. Мой точный сценарий был:
Нет, отчет об ошибках — это не уровень журнала, а битовое поле. Использование 999999 — очень плохая идея, используйте степень двойки минус 1, например 2047!
Вы совершенно правы, @peterh! Я изменил его на E_ALL, так как это позволит сообщать обо всех ошибках (кроме строгих ошибок в php 5.4 и ниже).
Если вы каким-то образом оказались в ситуации, когда вы не можете изменить настройку через php.ini или .htaccess, вам не повезло с отображением ошибок, когда ваши PHP-скрипты содержат ошибки синтаксического анализа. Затем вам нужно будет разрешить проверку файлов в командной строке следующим образом:
Если ваш хост настолько заблокирован, что не позволяет изменять значение через php.ini или .htaccess , он также может запретить изменение значения через ini_set . Вы можете проверить это с помощью следующего PHP-скрипта:
Вы можете сделать следующее:
Установите следующие параметры в основном файле индекса:
Затем в зависимости от ваших требований вы можете выбрать, что вы хотите показать:
Для всех ошибок, предупреждений и уведомлений:
Для всех предупреждений:
Для всех уведомлений:
Для получения дополнительной информации см. здесь.
Вы можете добавить свой собственный обработчик ошибок, который может предоставить дополнительную отладочную информацию. Кроме того, вы можете настроить отправку информации по электронной почте.
"; echo $msg; вернуть false; > function EXC_HANDLER($exception)< ERR_HANDLER(0, $exception->getMessage(), $exception->getFile(), $exception->getLine()); > function ShutDownFunction() < $error = error_get_last(); if ($error["type"] == 1) < ERR_HANDLER($error["type"], $error["message"], $error["file" ], $error["строка"]); >> set_error_handler ("ERR_HANDLER", E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED); register_shutdown_function("shutdownFunction"); set_exception_handler("EXC_HANDLER");
Этот код должен работать:
Однако попробуйте отредактировать код на телефоне в файле:
Лучшее/простое/быстрое решение, которое вы можете использовать, если это быстрая отладка, – окружить код перехватывающими исключениями. Это то, что я делаю, когда хочу быстро проверить что-то в действии.
Функция error_reporting() указывает, о каких ошибках сообщается.
PHP имеет много уровней ошибок, и использование этой функции устанавливает этот уровень для текущего скрипта.
Синтаксис
Значения параметров
Параметр | Описание |
---|---|
уровень | Необязательно. Указывает уровень отчета об ошибке для текущего скрипта. Допускаются номера ошибок и именованные константы. Примечание. Рекомендуется использовать именованные константы для обеспечения совместимости с будущими версиями PHP |
Технические детали
Возвращаемое значение: | Возвращает старый уровень отчетов об ошибках или текущий уровень сообщений об ошибках, если нет < задан параметр em>level |
---|---|
Версия PHP: | 4.0+ |
Список изменений PHP: | PHP 5.4: E_STRICT теперь является частью E_ALL. PHP 5.3: Новое: E_DEPRECATED и E_USER_DEPRECATED. PHP 5.2: Новое: E_RECOVERABLE_ERROR. PHP 5.0: Новое: E_STRICT. |
Мы только что запустили
видео W3Schools
ПИКЕР ЦВЕТА
Получите сертификат
пройдя курс
сегодня!
КОД ИГРА
Сообщить об ошибке
Если вы хотите сообщить об ошибке или сделать предложение, не стесняйтесь отправить нам электронное письмо:
Спасибо за помощь!
Ваше сообщение было отправлено в W3Schools.
Лучшие учебные пособия
Лучшие ссылки
Лучшие примеры
Веб-курсы
W3Schools оптимизирована для обучения и повышения квалификации. Примеры могут быть упрощены для улучшения чтения и обучения. Учебники, ссылки и примеры постоянно пересматриваются, чтобы избежать ошибок, но мы не можем гарантировать полную правильность всего содержания.Используя W3Schools, вы соглашаетесь прочитать и принять наши условия использования, политику конфиденциальности и файлы cookie.
PHP – это серверный язык сценариев, используемый в веб-разработке. В качестве языка сценариев PHP используется для написания кода (или сценариев) для выполнения задач. Если сценарий обнаруживает ошибку, PHP может создать запись об ошибке в файл журнала.
Из этого руководства вы узнаете, как включить отчеты об ошибках PHP для отображения всех предупреждений. Мы также углубимся в создание файла журнала ошибок в PHP.
Что такое ошибка PHP?
Ошибка PHP возникает, когда есть проблема в коде PHP. Даже что-то простое может вызвать ошибку, например, использование неправильного синтаксиса или пропуск точки с запятой, которая вызывает уведомление. Или причина может быть более сложной, например вызов неправильной переменной, что может привести к фатальной ошибке, которая приведет к сбою вашей системы.
Как отобразить все ошибки PHP
Если вы не видите ошибок, возможно, вам нужно включить отчеты об ошибках.
Чтобы включить отчеты об ошибках в PHP, отредактируйте файл кода PHP и добавьте следующие строки:
Вы также можете использовать команду ini_set для включения отчетов об ошибках:
Отредактируйте php.ini, чтобы включить отчеты об ошибках PHP
Если вы настроили PHP-код для отображения ошибок, но они по-прежнему не видны, вам может потребоваться внести изменения в файл php.ini.
В дистрибутивах Linux этот файл обычно находится в папке /etc/php.ini.
Откройте php.ini в текстовом редакторе.
Затем измените строку display_errors на On .
Это пример исправления в текстовом редакторе:
Отредактируйте файл .htaccess, чтобы включить отчеты об ошибках
Файл .htaccess, выступающий в роли основного файла конфигурации, обычно находится в корневом или общедоступном каталоге. Точка в начале означает, что он скрыт. Если вы используете файловый менеджер, вам нужно изменить настройки, чтобы увидеть скрытые файлы.
Откройте файл .htaccess для редактирования и добавьте следующее:
Если эти значения уже указаны, убедитесь, что они включены.
Сохраните файл и выйдите.
Другие полезные команды
Чтобы отобразить только фатальные предупреждения и ошибки синтаксического анализа, используйте следующее:
Вы можете добавить любые другие типы ошибок, которые вам нужны. Просто разделите их трубкой | символ.
Этот список содержит все предопределенные константы для типов ошибок PHP.
Одна из полезных функций – символ "не".
Чтобы исключить определенный тип ошибок из отчетов:
В этом примере в выходных данных отображаются все ошибки, кроме ошибок уведомлений.
Как отключить отчеты об ошибках PHP
Чтобы выключить или отключить отчеты об ошибках в PHP, установите значение равным нулю. Например, используйте фрагмент кода:
Как создать файл журнала ошибок в PHP
Журналы ошибок являются ценным ресурсом при решении проблем с PHP.
Чтобы отобразить журналы ошибок PHP, отредактируйте файл .htaccess, добавив следующее:
Чтобы включить ведение журнала ошибок, отредактируйте свою версию файла и добавьте следующее:
Как отображать ошибки PHP на веб-странице
Журналы ошибок являются ценным ресурсом при решении проблем с PHP.
Чтобы отобразить журналы ошибок PHP, отредактируйте файл .htaccess, добавив следующее:
Чтобы включить ведение журнала ошибок, отредактируйте свою версию файла и добавьте следующее:
Это руководство предоставило вам несколько вариантов включения и отображения всех ошибок и предупреждений PHP. Получая уведомления об ошибках быстро и точно, вы можете улучшить способность устранять проблемы с PHP. Если вы внедряете новые функции, устанавливаете новое приложение на основе PHP или пытаетесь найти ошибку на своем веб-сайте, важно знать, какая версия PHP работает на вашем веб-сервере, прежде чем предпринимать какие-либо действия.
Читайте также: