(PHP 4, PHP 5, PHP 7, PHP
error_reporting —
Задаёт, какие ошибки PHP попадут в отчёт
Описание
error_reporting(?int $error_level
= null
): int
Список параметров
-
error_level
-
Новое значение уровня
error_reporting. Это может
быть битовая маска или именованные константы. При использовании
именованных констант нужно будет следить за совместимостью с новыми
версиями PHP. В новых версиях могут добавиться новые уровни ошибок,
увеличиться диапазон целочисленных типов. Все это может привести к
нестабильной работе при использовании старых целочисленных обозначений
уровней ошибок.Доступные константы уровней ошибок и их описания приведены в разделе
Предопределённые константы.
Возвращаемые значения
Возвращает старое значение уровня
error_reporting либо текущее
значение, если аргумент error_level
не задан.
Список изменений
Версия | Описание |
---|---|
8.0.0 |
error_level теперь допускает значение null.
|
Примеры
Пример #1 Примеры использования error_reporting()
<?php// Выключение протоколирования ошибок
error_reporting(0);// Включать в отчёт простые описания ошибок
error_reporting(E_ERROR | E_WARNING | E_PARSE);// Включать в отчёт E_NOTICE сообщения (добавятся сообщения о
// непроинициализированных переменных или ошибках в именах переменных)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);// Добавлять сообщения обо всех ошибках, кроме E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);// Добавлять в отчёт все ошибки PHP
error_reporting(E_ALL);// Добавлять в отчёт все ошибки PHP
error_reporting(-1);// То же, что и error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);?>
Примечания
Подсказка
Если передать -1
, будут отображаться все возможные
ошибки, даже если в новых версиях PHP добавятся уровни или константы.
Поведение эквивалентно передаче константы E_ALL
.
info at hephoz dot de ¶
14 years ago
If you just see a blank page instead of an error reporting and you have no server access so you can't edit php configuration files like php.ini try this:
- create a new file in which you include the faulty script:
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("file_with_errors.php");
?>
- execute this file instead of the faulty script file
now errors of your faulty script should be reported.
this works fine with me. hope it solves your problem as well!
dave at davidhbrown dot us ¶
16 years ago
The example of E_ALL ^ E_NOTICE is a 'bit' confusing for those of us not wholly conversant with bitwise operators.
If you wish to remove notices from the current level, whatever that unknown level might be, use & ~ instead:
<?php
//....
$errorlevel=error_reporting();
error_reporting($errorlevel & ~E_NOTICE);
//...code that generates notices
error_reporting($errorlevel);
//...
?>
^ is the xor (bit flipping) operator and would actually turn notices *on* if they were previously off (in the error level on its left). It works in the example because E_ALL is guaranteed to have the bit for E_NOTICE set, so when ^ flips that bit, it is in fact turned off. & ~ (and not) will always turn off the bits specified by the right-hand parameter, whether or not they were on or off.
jcastromail at yahoo dot es ¶
2 years ago
Under PHP 8.0, error_reporting() does not return 0 when then the code uses a @ character.
For example
<?php
$a
=$array[20]; // error_reporting() returns 0 in php <8 and 4437 in PHP>=8?>
Fernando Piancastelli ¶
18 years ago
The error_reporting() function won't be effective if your display_errors directive in php.ini is set to "Off", regardless of level reporting you set. I had to set
display_errors = On
error_reporting = ~E_ALL
to keep no error reporting as default, but be able to change error reporting level in my scripts.
I'm using PHP 4.3.9 and Apache 2.0.
lhenry at lhenry dot com ¶
3 years ago
In php7, what was generally a notice or a deprecated is now a warning : the same level of a mysql error … unacceptable for me.
I do have dozen of old projects and I surely d'ont want to define every variable which I eventually wrote 20y ago.
So two option: let php7 degrade my expensive SSDs writing Gb/hours or implement smthing like server level monitoring ( with auto_[pre-ap]pend_file in php.ini) and turn off E_WARNING
Custom overriding the level of php errors should be super handy and flexible …
ecervetti at orupaca dot fr ¶
13 years ago
It could save two minutes to someone:
E_ALL & ~E_NOTICE integer value is 6135
luisdev ¶
4 years ago
This article refers to these two reporting levels:
// Report all PHP errors (see changelog)
error_reporting(E_ALL);
// Report all PHP errors
error_reporting(-1);
What is the difference between those two levels?
Please update this article with a clear explanation of the difference and the possible use cases.
qeremy ! gmail ¶
7 years ago
If you want to see all errors in your local environment, you can set your project URL like "foo.com.local" locally and put that in bootstrap file.
<?php
if (substr($_SERVER['SERVER_NAME'], -6) == '.local') {
ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL);
// or error_reporting(E_ALL);
}
?>
Rash ¶
8 years ago
If you are using the PHP development server, run from the command line via `php -S servername:port`, every single error/notice/warning will be reported in the command line itself, with file name, and line number, and stack trace.
So if you want to keep a log of all the errors even after page reloads (for help in debugging, maybe), running the PHP development server can be useful.
chris at ocproducts dot com ¶
6 years ago
The error_reporting() function will return 0 if error suppression is currently active somewhere in the call tree (via the @ operator).
keithm at aoeex dot com ¶
12 years ago
Some E_STRICT errors seem to be thrown during the page's compilation process. This means they cannot be disabled by dynamically altering the error level at run time within that page.
The work-around for this was to rename the file and replace the original with a error_reporting() call and then a require() call.
Ex, rename index.php to index.inc.php, then re-create index.php as:
<?php
error_reporting(E_ALL & ~(E_STRICT|E_NOTICE));
require('index.inc.php');
?>
That allows you to alter the error reporting prior to the file being compiled.
I discovered this recently when I was given code from another development firm that triggered several E_STRICT errors and I wanted to disable E_STRICT on a per-page basis.
kevinson112 at yahoo dot com ¶
4 years ago
I had the problem that if there was an error, php would just give me a blank page. Any error at all forced a blank page instead of any output whatsoever, even though I made sure that I had error_reporting set to E_ALL, display_errors turned on, etc etc. But simply running the file in a different directory allowed it to show errors!
Turns out that the error_log file in the one directory was full (2.0 Gb). I erased the file and now errors are displayed normally. It might also help to turn error logging off.
https://techysupport.co/norton-tech-support/
adam at adamhahn dot com ¶
5 years ago
To expand upon the note by chris at ocproducts dot com. If you prepend @ to error_reporting(), the function will always return 0.
<?php
error_reporting(E_ALL);
var_dump(
error_reporting(), // value of E_ALL,
@error_reporting() // value is 0
);
?>
vdephily at bluemetrix dot com ¶
17 years ago
Note that E_NOTICE will warn you about uninitialized variables, but assigning a key/value pair counts as initialization, and will not trigger any error :
<?php
error_reporting(E_ALL);$foo = $bar; //notice : $bar uninitialized$bar['foo'] = 'hello'; // no notice, although $bar itself has never been initialized (with "$bar = array()" for example)$bar = array('foobar' => 'barfoo');
$foo = $bar['foobar'] // ok$foo = $bar['nope'] // notice : no such index
?>
fredrik at demomusic dot nu ¶
17 years ago
Remember that the error_reporting value is an integer, not a string ie "E_ALL & ~E_NOTICE".
This is very useful to remember when setting error_reporting levels in httpd.conf:
Use the table above or:
<?php
ini_set("error_reporting", E_YOUR_ERROR_LEVEL);
echo ini_get("error_reporting");
?>
To get the appropriate integer for your error-level. Then use:
php_admin_value error_reporting YOUR_INT
in httpd.conf
I want to share this rather straightforward tip as it is rather annoying for new php users trying to understand why things are not working when the error-level is set to (int) "E_ALL" = 0...
Maybe the PHP-developers should make ie error_reporting("E_ALL"); output a E_NOTICE informative message about the mistake?
rojaro at gmail dot com ¶
12 years ago
To enable error reporting for *ALL* error messages including every error level (including E_STRICT, E_NOTICE etc.), simply use:
<?php error_reporting(-1); ?>
j dot schriver at vindiou dot com ¶
22 years ago
error_reporting() has no effect if you have defined your own error handler with set_error_handler()
[Editor's Note: This is not quite accurate.
E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR and E_COMPILE_WARNING error levels will be handled as per the error_reporting settings.
All other levels of errors will be passed to the custom error handler defined by set_error_handler().
Zeev Suraski suggests that a simple way to use the defined levels of error reporting with your custom error handlers is to add the following line to the top of your error handling function:
if (!($type & error_reporting())) return;
-zak@php.net]
kc8yds at gmail dot com ¶
14 years ago
this is to show all errors for code that may be run on different versions
for php 5 it shows E_ALL^E_STRICT and for other versions just E_ALL
if anyone sees any problems with it please correct this post
<?php
ini_set('error_reporting', version_compare(PHP_VERSION,5,'>=') && version_compare(PHP_VERSION,6,'<') ?E_ALL^E_STRICT:E_ALL);
?>
misplacedme at gmail dot com ¶
13 years ago
I always code with E_ALL set.
After a couple of pages of
<?php
$username = (isset($_POST['username']) && !empty($_POST['username']))....
?>
I made this function to make things a little bit quicker. Unset values passed by reference won't trigger a notice.
<?php
function test_ref(&$var,$test_function='',$negate=false) {
$stat = true;
if(!isset($var)) $stat = false;
if (!empty($test_function) && function_exists($test_function)){
$stat = $test_function($var);
$stat = ($negate) ? $stat^1 : $stat;
}
elseif($test_function == 'empty') {
$stat = empty($var);
$stat = ($negate) ? $stat^1 : $stat;
}
elseif (!function_exists($test_function)) {
$stat = false;
trigger_error("$test_function() is not a valid function");
}
$stat = ($stat) ? true : false;
return $stat;
}
$a = '';
$b = '15';test_ref($a,'empty',true); //False
test_ref($a,'is_int'); //False
test_ref($a,'is_numeric'); //False
test_ref($b,'empty',true); //true
test_ref($b,'is_int'); //False
test_ref($b,'is_numeric'); //false
test_ref($unset,'is_numeric'); //false
test_ref($b,'is_number'); //returns false, with an error.
?>
Alex ¶
16 years ago
error_reporting() may give unexpected results if the @ error suppression directive is used.
<?php
@include 'config.php';
include 'foo.bar'; // non-existent file
?>
config.php
<?php
error_reporting(0);
?>
will throw an error level E_WARNING in relation to the non-existent file (depending of course on your configuration settings). If the suppressor is removed, this works as expected.
Alternatively using ini_set('display_errors', 0) in config.php will achieve the same result. This is contrary to the note above which says that the two instructions are equivalent.
Daz Williams (The Northeast) ¶
13 years ago
Only display php errors to the developer...
<?php
if($_SERVER['REMOTE_ADDR']=="00.00.00.00")
{
ini_set('display_errors','On');
}
else
{
ini_set('display_errors','Off');
}
?>
Just replace 00.00.00.00 with your ip address.
teynon1 at gmail dot com ¶
11 years ago
It might be a good idea to include E_COMPILE_ERROR in error_reporting.
If you have a customer error handler that does not output warnings, you may get a white screen of death if a "require" fails.
Example:
<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE);
function
myErrorHandler($errno, $errstr, $errfile, $errline) {
// Do something other than output message.
return true;
}$old_error_handler = set_error_handler("myErrorHandler");
require
"this file does not exist";
?>
To prevent this, simply include E_COMPILE_ERROR in the error_reporting.
<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
?>
forcemdt ¶
9 years ago
Php >5.4
Creating a Custom Error Handler
set_error_handler("customError",E_ALL);
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}
huhiko334 at yandex dot ru ¶
4 years ago
If you get a weird mysql warnings like "Warning: mysql_query() : Your query requires a full tablescan...", don't look for error_reporting settings - it's set in php.ini.
You can turn it off with
ini_set("mysql.trace_mode","Off");
in your script
http://tinymy.link/mctct
DarkGool ¶
17 years ago
In phpinfo() error reporting level display like a bit (such as 4095)
Maybe it is a simply method to understand what a level set on your host
if you are not have access to php.ini file
<?php
$bit = ini_get('error_reporting');
while ($bit > 0) {
for($i = 0, $n = 0; $i <= $bit; $i = 1 * pow(2, $n), $n++) {
$end = $i;
}
$res[] = $end;
$bit = $bit - $end;
}
?>
In $res you will have all constants of error reporting
$res[]=int(16) // E_CORE_ERROR
$res[]=int(8) // E_NOTICE
...
&IT ¶
2 years ago
error_reporting(E_ALL);
if (!ini_get('display_errors')) {
ini_set('display_errors', '1');
}
За уровень обработки ошибок в PHP отвечает директива error_reporting
конфигурационного файла php.ini
. Данный параметр определяет типы ошибок, о которых PHP информирует выводом текстового сообщения в окно браузера.
Возможные значения директивы
Уровень ошибки | Константа | Описание ошибки |
---|---|---|
1 | E_ERROR | Ошибки обычных функций (критичные ошибки) |
2 | E_WARNING | Обычные предупреждения (не критичные ошибки) |
4 | E_PARSE | Ошибки синтаксического анализатора |
8 | E_NOTICE | Замечания (аномалии в коде, возможные источники ошибок — следует отключить при наличии русского текста в коде, так как для интернациональных кодировок не обеспечивается корректная работа). |
16 | E_CORE_ERROR | Ошибки обработчика |
32 | E_CORE_WARNING | Предупреждения обработчика |
64 | E_COMPILE_ERROR | Ошибки компилятора |
128 | E_COMPILE_WARNING | Предупреждения компилятора |
256 | E_USER_ERROR | Ошибки пользователей |
512 | E_USER_WARNING | Предупреждения пользователей |
1024 | E_USER_NOTICE | Уведомления пользователей |
E_ALL | Все ошибки |
Вышеуказанные значения (цифровые или символьные) используются для построения битовой маски, которая специфицирует выводимое сообщение об ошибке. Вы можете использовать битовые операции для маскирования определённых типов ошибок. Обратите внимание, что только ‘|’, ‘~’, ‘!’ и ‘&’ будут понятны в php.ini и что никакие битовые операции не будут понятны в php3.ini.
В PHP 4 значением по умолчанию для error_reporting
будет E_ALL & ~E_NOTICE
, что означает отображение всех ошибок и предупреждений, которые не имеют уровень E_NOTICE-level. В PHP 3 значение по умолчанию — E_ERROR | E_WARNING | E_PARSE
означает то же самое.
Заметьте, однако, что, поскольку константы не поддерживаются в PHP 3 в файле php3.ini, установка error_reporting
должна выполняться цифрами; то есть 7 по умолчанию.
Настройка при помощи php.ini
Параметр error_reporting позволяет устанавливать несколько уровней, используя побитовые флаги. К примеру, уровень:
error_reporting = E_ALL & ~E_NOTICE
позволяет выводить все ошибки, за исключением замечаний.
А для того чтобы показывать только ошибки (исключая предупреждения и замечания), директива должна быть настроена так, как показано ниже:
error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
Настройка при помощи .htaccess
Включаем вывод ошибок в окно браузера и устанавливаем нужный уровень.
<br /> php_flag display_errors On<br /> php_value error_reporting E_ALL<br />
Настройка при помощи PHP
Включаем вывод ошибок в окно браузера и устанавливаем нужный уровень.
<?php error_reporting(E_ALL); ini_set("display_error", true); ini_set("error_reporting", E_ALL); ?>
Ссылки
- Функция error_reporting
- Директива error_reporting файла php.ini
PHP Документация
На чтение 11 мин Просмотров 1.2к. Опубликовано 16.10.2021
PHP существует довольно давно и разработал свои особенности и особенности. Он также разработал свой собственный вид отчетов об ошибках, который довольно прост. В этом посте мы покажем вам, как легко добавить мониторинг ошибок для PHP.
Содержание
- Что такое ошибка PHP?
- Какие бывают типы ошибок в PHP?
- Ошибки синтаксического анализа или синтаксиса
- Фатальные ошибки
- Предупреждение об ошибках
- Уведомление об ошибках
- Как включить отчеты об ошибках в PHP
- Сколько уровней ошибок доступно в PHP?
- Ошибки отображения PHP
- Что такое предупреждение PHP?
- Как помогают отчеты о сбоях
- Завершение отчета об ошибках PHP
Что такое ошибка PHP?
Ошибка PHP — это структура данных, представляющая что-то, что пошло не так в вашем приложении. В PHP есть несколько конкретных способов вызова ошибок. Один из простых способов имитировать ошибку — использовать die()функцию:
die("something bad happened!");
Это завершит программу PHP и сообщит об ошибке. Когда программа завершается, это то, что мы называем фатальной ошибкой. Позже вы увидите, что мы можем контролировать, как именно обрабатывается ошибка, в случае, если нам нужно вызвать некоторую логику очистки или перенаправить сообщение об ошибке. Вы также можете смоделировать это с помощью trigger_error()функции:
<?php trigger_error("something happened"); //error level is E_USER_NOTICE //You can control error level trigger_error("something bad happened", E_USER_ERROR); ?>
По умолчанию это вызовет в системе некритическое уведомление. Вы можете переопределить уровень ошибки, если вам нужна более серьезная ошибка.
На самом деле в PHP есть две формы ошибок: стандартные обычные ошибки и исключения.
Исключения были введены в PHP 5. Они дают вам легче семантику, как try, throwи catch. Исключение легко создать. Это следует из большого успеха языков со статической типизацией, таких как C # и Java.
throw new Exception("Yo, something exceptional happened);
Перехват и выдача исключений, как правило, более упрощены, чем более традиционная обработка ошибок PHP. Вы также можете иметь более локализованную обработку ошибок, а не только глобальную обработку ошибок с помощью set_error_handler (). Вы можете окружить конкретную логику блоками try / catch, которые заботятся только о конкретных исключениях:
<?php try { doSystemLogic(); } catch (SystemException $e) { echo 'Caught system exception '; } try { doUserLogic(); } catch (Exception $e) { echo 'Caught misc exception '; } ?>
Какие бывают типы ошибок в PHP?
Ошибка PHP — это не одно и то же, но бывает четырех разных типов:
- синтаксические или синтаксические ошибки
- фатальные ошибки
- предупреждения об ошибках
- замечать ошибки
Ошибки синтаксического анализа или синтаксиса
Первая категория ошибок в PHP — это ошибки синтаксического анализа, также называемые синтаксическими ошибками. Они просто означают, что в вашем скрипте есть один или несколько неправильных символов. Возможно, вы пропустили точку с запятой или неправильно поставили скобку. Взгляните на следующий пример:
<?php $age = 25; if ($age >= 18 { echo 'Of Age'; } else { echo 'Minor'; } ?>
Запустив приведенный выше сценарий, я получаю следующую ошибку:
Parse error: syntax error, unexpected '{' in <path> on line 4
С помощью сообщения об ошибке легко увидеть, что в операторе if отсутствует закрывающая скобка. Давайте исправим это:
<?php $age = 25; if ($age >= 18) { echo 'Of Age'; } else { echo 'Minor'; } ?>
Фатальные ошибки
Неустранимые ошибки, как следует из их названия, — это те, которые способны убить — или привести к сбою — приложение. Другими словами, фатальные ошибки — это критические ошибки, означающие, что произошло что-то катастрофическое, и приложение не может продолжать работу.
Часто причиной фатальных ошибок является неопределенный класс, функция или другой артефакт. Если сценарий пытается использовать несуществующую функцию, PHP не знает, что делать, и сценарий необходимо остановить.
Рассмотрим следующий сценарий:
<?php function add($a, $b) { return $a + $b; } echo '2 + 2 is ' . sum(2, 2); ?>
Как видите, сценарий определяет функцию с именем add, а затем пытается вызвать ее с неправильным именем. Эта ситуация приводит к фатальной ошибке:
Fatal error: Uncaught Error: Call to undefined function sum() in F:xampphtdocstest.php:7 Stack trace: #0 {main} thrown in <path> on line 7
Все, что нужно для решения ошибки, — это изменить вызов функции на правильное имя, добавить:
echo '2 + 2 is ' . add(2, 2);
Предупреждение об ошибках
Предупреждающие ошибки — это ошибки, которые не приводят к завершению работы скрипта. Подобно тому, что происходит на других языках, предупреждение в PHP обычно представляет собой что-то, что еще не является серьезной проблемой — или, по крайней мере, не критичной, — но может стать серьезной проблемой в будущем, поэтому вам лучше сохранить глаз на это.
Взгляните на следующий код:
<?php $components = parse_url(); var_dump($components); ?>
После выполнения приведенного выше кода мы получаем следующее предупреждение:
Warning: parse_url() expects at least 1 parameter, 0 given in <path> on line 2
Предупреждение вызывает тот факт, что мы не предоставили параметр функции parse_url. Давайте исправим это:
<?php $components = parse_url('https://example.com'); var_dump($components); ?>
Это устраняет предупреждение:
array(2) { ["scheme"]=> string(5) "https" ["host"]=> string(11) "example.com" }
Уведомление об ошибках
Уведомления об ошибках похожи на предупреждения в том, что они также не останавливают выполнение скрипта. Вы также должны думать об ошибках уведомления как о том, что PHP предупреждает вас о том, что может стать проблемой в будущем. Однако уведомления обычно считаются менее важными или менее важными, чем предупреждения.
Рассмотрим следующий фрагмент кода, который представляет собой измененную версию сценария, использованного в предыдущих разделах:
<?php $numbers = "1,2,5,6"; $parts = explode(",", $integers); echo 'The first number is ' . $parts[0]; ?>
Как видите, сценарий определяет переменную $ numbers, а затем пытается передать переменную с именем $ inteers в функцию explode.
Неопределенные переменные действительно являются одной из основных причин уведомлений в PHP. Чтобы ошибка исчезла, достаточно изменить переменную $ inteers на $ numbers.
Как включить отчеты об ошибках в PHP
Включить отчеты об ошибках в PHP очень просто. Вы просто вызываете функцию в своем скрипте:
<?php error_reporting(E_ALL); //You can also report all errors by using -1 error_reporting(-1); //If you are feeling old school ini_set('error_reporting', E_ALL); ?>
Здесь сказано: «Пожалуйста, сообщайте об ошибках всех уровней». Мы рассмотрим, какие уровни есть позже, но считаем это категорией ошибок. По сути, он говорит: «Сообщайте обо всех категориях ошибок». Вы можете отключить отчет об ошибках, установив 0:
<?php error_reporting(0); ?>
Параметр метода в error_reporting()действительности является битовой маской. Вы можете указать в нем различные комбинации уровней ошибок, используя эту маску, как видите:
<?php error_reporting(E_ERROR | E_WARNING | E_PARSE); ?>
В нем говорится: «сообщать о фатальных ошибках, предупреждениях и ошибках синтаксического анализатора». Вы можете просто разделить их знаком «|» чтобы добавить больше ошибок. Иногда вам могут потребоваться более расширенные настройки отчетов об ошибках. Вы можете использовать операторы битовой маски для составления отчетов по различным критериям:
<?php // Report all errors except E_NOTICE error_reporting(E_ALL & ~E_NOTICE); ?>
Как видите, вы можете гибко определять, о каких ошибках сообщать. Возникает вопрос: о каких типах ошибок и исключений следует сообщать?
Сколько уровней ошибок доступно в PHP?
В PHP 5 целых 16 уровней ошибок. Эти ошибки представляют категорию, а иногда и серьезность ошибки в PHP. Их много, но многочисленные категории позволяют легко определить, где отлаживать ошибку, исходя только из ее уровня. Итак, если вы хотите сделать что-то конкретное только для ошибок пользователя, например, проверку ввода, вы можете определить обработчик условий для всего, что начинается с E_USER. Если вы хотите убедиться, что вы закрыли ресурс, вы можете сделать это, указав на ошибки, оканчивающиеся на _ERROR.
Ошибки в PHP по большей части классифицируются по степени серьезности (предупреждение об ошибке, уведомление) и источнику (пользователь, компилятор, среда выполнения).
Я хочу остановиться на нескольких популярных из них.
Во-первых, у нас есть общие ошибки:
- E_ERROR (значение 1): это типичная фатальная ошибка. Если вы видите этого плохого парня, ваше приложение готово. Перезагрузите и попробуйте еще раз.
- E_WARNING (2): это ошибки, которые не приводят к сбою вашего приложения. Похоже, что большинство ошибок находятся на этом уровне.
Далее у нас есть пользовательские ошибки:
- E_USER_ERROR (256): созданная пользователем версия указанной выше фатальной ошибки. Это часто создается с помощью trigger_error ().
- E_USER_NOTICE (1024): созданная пользователем версия информационного события. Обычно это не оказывает неблагоприятного воздействия на приложение, как и log.info ().
Последняя категория, на которую следует обратить внимание, — это ошибки жизненного цикла приложения, обычно с «core» или «compile» в названии:
- EE_CORE_ERROR (16): Подобно фатальным ошибкам выше, эта ошибка может возникнуть только при запуске приложения PHP.
- EE_COMPILE_WARNING (128): нефатальная ошибка, которая возникает только тогда, когда скрипт PHP не компилируется.
Есть еще несколько ошибок. Вы можете найти их полный список здесь.
Ошибки отображения PHP
Отображение сообщений об ошибках в PHP часто сбивает с толку. Просто погуглите «Отображение сообщения об ошибке PHP» и посмотрите. Почему так?
В PHP вы можете решить, отображать ли ошибки или нет. Это отличается от сообщения о них. Сообщение о них гарантирует, что ошибки не будут проглочены. Но отображение их покажет их пользователю. Вы можете настроить отображение всех ошибок PHP с помощью директив display_errors и display_startup_errors:
<?php ini_set('display_errors', 1); ini_set('display_startup_errors', 1); ?>
Их включение гарантирует, что они будут отображаться в теле веб-ответа пользователю. Обычно рекомендуется отключать их в среде, не связанной с разработкой. Целочисленный параметр метода также является битовой маской, как в error_reporting(). Здесь также применяются те же правила и параметры для этого параметра.
Что такое предупреждение PHP?
Выше вы заметили, что одним из уровней ошибок является E_WARNING. Вы также могли заметить, что многие уровни ошибок имеют версии предупреждений. Я хочу немного в этом разобраться. Основное различие между предупреждением и ошибкой в PHP заключается в том, завершает ли оно приложение. В PHP большинство ошибок фактически не останавливают выполнение скрипта.
Вот пример:
<?php $x = 1; trigger_error("user warning!", E_USER_WARNING); $x = 3; echo "$x is ${$x}"; ?>
Вы все равно будете видеть, $x is 3несмотря на срабатывание предупреждения. Это может быть полезно, если вы хотите собрать список ошибок проверки. Я лично предпочитаю использовать исключения в наши дни, но ваш опыт может отличаться.
Конечно, вы можете настроить отображение предупреждений PHP или нет. Для этого вы должны использовать конфигурацию display_errors, которую вы видели в предыдущем разделе.
Как помогают отчеты о сбоях
PHP упрощает настройку внешних инструментов отчетов об ошибках, подобных тем, которые предлагает Raygun. Он предоставляет несколько различных ловушек для своей среды выполнения, чтобы обрабатывать ошибки и отправлять их по сети. См. Этот пример, взятый со страницы PHP Raygun :
namespace { // paste your 'requires' statement $client = new Raygun4phpRaygunClient("apikey for your application"); function error_handler($errno, $errstr, $errfile, $errline ) { global $client; $client->SendError($errno, $errstr, $errfile, $errline); } function exception_handler($exception) { global $client; $client->SendException($exception); } set_exception_handler('exception_handler'); set_error_handler("error_handler"); }
Сначала мы объявляем клиента, используя ключ API для безопасности:
$client = new Raygun4phpRaygunClient("apikey for your application");
Затем мы создаем пару функций, которые обрабатывают наши ошибки и исключения:
function error_handler($errno, $errstr, $errfile, $errline ) { global $client; $client->SendError($errno, $errstr, $errfile, $errline); } function exception_handler($exception) { global $client; $client->SendException($exception); }
Обратите внимание, что мы вызываем SendError()функцию, передавая некоторые важные сведения о структуре данных ошибки. Это сделает удаленный вызов Raygun.
Наконец, мы подключаем их к среде выполнения PHP, глобально обрабатывая как традиционные ошибки, так и новые исключения:
set_exception_handler('exception_handler'); set_error_handler("error_handler");
Вот и все. Имея все это на месте, мы можем получить красиво отформатированный отчет об ошибках, который может выглядеть следующим образом:
Завершение отчета об ошибках PHP
Как видите, отчеты об ошибках PHP просты. Вы можете инициировать исключения с помощью специальных функций. Вы также можете запускать исключения, как и в других типизированных языках.
Также вы можете легко подключить свои собственные обработчики и управлять отчетностью и отображением ошибок. Это позволяет нам подключить инструмент Raygun без особых усилий — не стесняйтесь подписаться на пробную версию Raygun и добавить ее в свое приложение за считанные минуты.
Иногда ваше приложение не запускается должным образом, что приводит к ошибкам. Есть ряд причин, которые могут вызвать ошибки, например:
- Веб-серверу может не хватить места на диске;
- Пользователь мог ввести недопустимое значение в поле формы;
- Файл или запись базы данных, к которой вы пытались получить доступ, возможно, не существует;
- Приложение может не иметь разрешения на запись в файл на диске;
- Служба, к которой приложение должно получить доступ, может быть временно недоступна.
Эти типы ошибок известны как ошибки времени выполнения, потому что они возникают во время выполнения скрипта. Они отличаются от синтаксических ошибок, которые необходимо исправлять перед запуском скриптов.
Профессиональное приложение должно иметь возможность изящно обрабатывать такие ошибки времени выполнения. Обычно это означает более четкое и точное информирование пользователя о проблеме.
Понимание уровней ошибок
Обычно, когда возникает проблема, препятствующая правильной работе скрипта, механизм PHP выдает ошибку. Каждая ошибка представлена целым числом и соответствующей константой. В следующей таблице перечислены некоторые из распространенных уровней ошибок:
Название | Значение | Описание |
---|---|---|
E_ERROR |
1 |
Неустранимая ошибка времени выполнения от которой невозможно избавиться. Выполнение скрипта немедленно прекращается. |
E_WARNING |
2 |
Предупреждение во время выполнения. Она несущественна, и большинство ошибок попадают в эту категорию. Выполнение скрипта не останавливается. |
E_NOTICE |
8 |
Уведомление во время выполнения. Указывает, что скрипт обнаружил что-то, что могло быть ошибкой, хотя такая ситуация также может возникнуть при обычном запуске скрипта. |
E_USER_ERROR |
256 |
Сообщение о фатальной пользовательской ошибке. Она похожа на E_ERROR , за исключением того, что она генерируется PHP-скриптом с использованием функции trigger_error() . |
E_USER_WARNING |
512 |
Предупреждающее сообщение, созданное пользователем без фатального исхода. Она похожа на E_WARNING , за исключением того, что она генерируется PHP-скриптом с использованием функции trigger_error() . |
E_USER_NOTICE |
1024 |
Сообщение с уведомлением, созданное пользователем. Она похожа на E_NOTICE за исключением того, что она генерируется PHP-скриптом с использованием функции trigger_error() . |
E_STRICT |
2048 |
Не совсем ошибка, но срабатывает всякий раз, когда PHP встречает код, который может привести к проблемам или несовместимости пересылки. |
E_ALL |
8191 |
Все ошибки и предупреждения, кроме E_STRICT до PHP 5.4.0. |
Дополнительные сведения об уровнях ошибок см. в справочнике по уровням ошибок PHP.
Механизм PHP вызывает ошибку всякий раз, когда он сталкивается с проблемой в вашем скрипте, но вы также можете инициировать ошибки самостоятельно, чтобы генерировать более удобные сообщения об ошибках. Таким образом вы можете сделать свое приложение более сложным. В следующем разделе описаны некоторые из распространенных методов, используемых для обработки ошибок в PHP:
Базовая обработка ошибок с помощью функции die()
Рассмотрим следующий пример, в котором просто попытаемся открыть текстовый файл только для чтения.
<?php
// Пробуем открыть несуществующий файл
$file = fopen("sample.txt", "r"); // Выводит: Warning: fopen(sample.txt) [function.fopen]: failed to open stream: No such file or directory in C:wampwwwprojecttest.php on line 2
?>
Если мы выполним несколько простых шагов, мы сможем предотвратить получение пользователями такого сообщения об ошибке.
<?php
if(file_exists("sample.txt")){
$file = fopen("sample.txt", "r");
} else{
die("Error: The file you are trying to access doesn't exist.");
}
?>
Как вы можете видеть, реализовав простую проверку, существует ли файл перед попыткой доступа к нему, мы можем сгенерировать сообщение об ошибке, которое будет более понятным для пользователя.
Используемая выше функция die()
просто отображает пользовательское сообщение об ошибке и завершает текущий скрипт, если файл sample.txt
не найден.
Создание собственного обработчика ошибок
Вы можете создать свою собственную функцию обработчика ошибок, чтобы справляться с ошибкой времени выполнения, генерируемой механизмом PHP. Пользовательский обработчик ошибок обеспечивает большую гибкость и лучший контроль над ошибками; он может проверять ошибку и решать, что с ней делать — отображать сообщение пользователю, регистрировать ошибку в файле или базе данных или отправлять по электронной почте, попытаться исправить проблему и продолжить, выйти из выполнения скрипта или вообще игнорировать ошибку.
Функция пользовательского обработчика ошибок должна иметь возможность обрабатывать как минимум два параметра (errno и errstr), однако она может дополнительно принимать три дополнительных параметра (errfile, errline и errcontext), как описано ниже:
Параметр | Описание |
---|---|
Обязательно — следующие параметры обязательны | |
errno. | Задает уровень ошибки в виде целого числа. Это соответствует соответствующей константе уровня ошибки (E_ERROR , E_WARNING и т. д.). |
errstr. | Задает сообщение об ошибке в виде строки. |
Опционально — следующие параметры являются необязательными | |
errfile. | Задает имя файла скрипта, в котором произошла ошибка. |
errline. | Задает номер строки, в которой произошла ошибка. |
errcontext. | Задает массив, содержащий все переменные и их значения, которые существовали на момент возникновения ошибки. Полезно для отладки. |
Вот пример простой пользовательской функции обработки ошибок. Этот обработчик customError()
запускается всякий раз, когда возникает ошибка, какой бы тривиальной она ни была. Затем он выводит сведения об ошибке в браузер и останавливает выполнение скрипта.
<?php
// Функция обработчика ошибок
function customError($errno, $errstr){
echo "<b>Error:</b> [$errno] $errstr";
}
?>
Вам нужно указать PHP, чтобы он использовал вашу пользовательскую функцию обработчика ошибок — просто вызовите встроенную функцию set_error_handler()
, передав имя функции.
<?php
// Функция обработчика ошибок
function customError($errno, $errstr){
echo "<b>Error:</b> [$errno] $errstr";
}
// Устанавливаем обработчик ошибок
set_error_handler("customError");
// Вызываем ошибку
echo($test);
?>
Регистрация ошибок
Журнал сообщений об ошибках в текстовом файле
Вы также можете записать подробную информацию об ошибке в файл журнала, например:
<?php
function calcDivision($dividend, $divisor){
if($divisor == 0){
trigger_error("calcDivision(): The divisor cannot be zero", E_USER_WARNING);
return false;
} else{
return($dividend / $divisor);
}
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
$message = date("Y-m-d H:i:s - ");
$message .= "Error: [" . $errno ."], " . "$errstr in $errfile on line $errline, ";
$message .= "Variables:" . print_r($errcontext, true) . "rn";
error_log($message, 3, "logs/app_errors.log");
die("There was a problem, please try again.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "This will never be printed.";
?>
Отправка сообщений об ошибках по электронной почте
Вы также можете отправить электронное письмо с подробностями об ошибке, используя ту же функцию error_log()
.
<?php
function calcDivision($dividend, $divisor){
if ($divisor == 0){
trigger_error("calcDivision(): The divisor cannot be zero", E_USER_WARNING);
return false;
} else{
return($dividend / $divisor);
}
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
$message = date("Y-m-d H:i:s - ");
$message .= "Error: [" . $errno ."], " . "$errstr in $errfile on line $errline, ";
$message .= "Variables:" . print_r($errcontext, true) . "rn";
error_log($message, 1, "webmaster@example.com");
die("There was a problem, please try again. Error report submitted to webmaster.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "This will never be printed.";
?>
Вызов ошибок
Хотя движок PHP выдает ошибку всякий раз, когда он сталкивается с проблемой в вашем скрипте, вы также можете вызвать ошибки самостоятельно. Это может помочь сделать ваше приложение более надежным, поскольку оно может выявлять потенциальные проблемы до того, как они перерастут в серьезные ошибки.
Чтобы вызвать ошибку в скрипте, вызовите функцию trigger_error()
, передав сообщение об ошибке, которое вы хотите сгенерировать:
trigger_error("There was a problem.");
Рассмотрим следующую функцию, которая вычисляет деление двух чисел.
<?php
function calcDivision($dividend, $divisor){
return($dividend / $divisor);
}
// Вызываем функцию
echo calcDivision(10, 0); // Выводит: Warning: Division by zero in C:wampwwwprojecttest.php on line 3
?>
Это сообщение выглядит не очень информативным. Рассмотрим следующий пример, в котором для генерации ошибки используется функция trigger_error()
.
<?php
function calcDivision($dividend, $divisor){
if($divisor == 0){
trigger_error("Делитель не может быть нулевым", E_USER_WARNING);
return false;
} else{
return($dividend / $divisor);
}
}
// Вызываем функцию
echo calcDivision(10, 0); // Выводит: Warning: Делитель не может быть нулевым C:wampwwwprojecterror.php on line 4
?>
Как видите, сообщение об ошибке, созданное во втором примере, более четко объясняет проблему по сравнению с предыдущим.
PHP — это достаточно свободный язык программирования, и это, на мой взгляд, большой минус. Главным недостатком здесь является то, что некоторые конструкции, которые в других языках сразу же отключат выполнение программы, в PHP является нормой и вполне допустимыми. Но если Вы хотите писать код изначально грамотно, то Вам необходимо знать о том, как выводить ошибки разных уровней.
В PHP есть несколько уровней ошибок, которые представлены в таблице ниже:
E_WARNING | Различного рода предупреждения. Например, если функция требует 3 параметра, а Вы передаёте только 2, то будет как раз ошибка уровня E_WARNING. |
E_NOTICE | Примерно то же самое, что и E_WARNING, но ошибки это очень мелкие, и они лишь могут стать причиной ошибок в будущем. Пример: использование неинициализированной переменной. Могу сказать, что данный уровень ошибок встречается практически в каждом мало-мальски сложном скрипте. |
E_DEPRECATED | Данный уровень ошибок возникает при использовании устаревших конструкций, например, при вызове какой-нибудь старой функции. |
E_PARSE | Ошибка синтаксического характера. Например, забыли поставить круглую скобку. |
E_ERROR | Ошибка, которая нам хорошо знакома. Как правило, мы её видем чаще всего. Самый простой пример — это вызов несуществующей функции. |
E_ALL | Все ошибки. |
На большинстве серверов стоит вывод ошибок уровня E_WARNING, E_PARSE и E_ERROR. То есть очень грубые замечания и фатальные ошибки. Если Вы хотите программировать профессионально, то контроль только таких ошибок не достаточен.
Я рекомендую на этапе создания проекта включать вывод уровня ошибок E_ALL. Сделать это очень просто:
<?php
error_reporting(E_ALL);
?>
И так нужно писать перед началом каждого скрипта. Если данный способ сильно не удобен, и Вы имеете доступ к php.ini, то в этом файле найдите директиву error_reporting и поставьте у неё значение E_ALL.
Если Вы с выводом такого уровня ошибок в PHP напишите код без единого замечания, то, значит, Вы создали, как минимум, неплохой продукт. Когда будете выкладывать уже на хостинг, то рекомендую данный уровень ошибок стереть, чтобы они не появлялись время от времени. Ведь PHP тоже обновляется и сегодня новые конструкции завтра могут уже устареть. И чтобы не вызывать ошибку уровня E_DEPRECATED, рекомендую отключать отображение подобных ошибок.
-
Создано 03.10.2012 08:13:35
-
Михаил Русаков
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
-
Кнопка:
Она выглядит вот так:
-
Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт
- BB-код ссылки для форумов (например, можете поставить её в подписи):
error_reporting
(PHP 4, PHP 5, PHP 7)
error_reporting —
Задает, какие ошибки PHP попадут в отчет
Описание
int error_reporting
([ int $level
] )
Список параметров
-
level
-
Новое значение уровня
error_reporting. Это может
быть битовая маска или именованные константы. При использовании
именованных констант нужно будет следить за совместимостью с новыми
версиями PHP. В новых версиях могут добавиться новые уровни ошибок,
увеличиться диапазон целочисленных типов. Все это может привести к
нестабильной работе при использовании старых целочисленных обозначений
уровней ошибок.Доступные константы уровней ошибок и их описания приведены в разделе
Предопределенные константы.
Возвращаемые значения
Возвращает старое значение уровня
error_reporting либо текущее
значение, если аргумент level
не задан.
Список изменений
Версия | Описание |
---|---|
5.4.0 | E_STRICT стал частьюE_ALL .
|
5.3.0 |
Добавлены E_DEPRECATED иE_USER_DEPRECATED .
|
5.2.0 |
Добавлена E_RECOVERABLE_ERROR .
|
5.0.0 |
Добавлена E_STRICT (не входит в составE_ALL ).
|
Примеры
Пример #1 Примеры использования error_reporting()
<?php// Выключение протоколирования ошибок
error_reporting(0);// Включать в отчет простые описания ошибок
error_reporting(E_ERROR | E_WARNING | E_PARSE);// Включать в отчет E_NOTICE сообщения (добавятся сообщения о
//непроинициализированных переменных или ошибках в именах переменных)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);// Добавлять сообщения обо всех ошибках, кроме E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);// Добавлять в отчет все PHP ошибки (см. список изменений)
error_reporting(E_ALL);// Добавлять в отчет все PHP ошибки
error_reporting(-1);// То же, что и error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);?>
Примечания
Внимание
Большинство E_STRICT
ошибок отлавливаются на этапе
компиляции, поэтому такие ошибки не включаются в отчет в файлах, где
error_reporting расширен для
включения E_STRICT
ошибок (и наоборот).
Подсказка
Если передать -1, будут отображаться все возможные
ошибки, даже если в новых версиях PHP добавятся уровни или константы. В
версии PHP 5.4. передача константы E_ALL
дает
тот же результат.
Вернуться к: Функции обработки ошибок
Предопределённые константы
Перечисленные ниже константы всегда доступны как часть ядра PHP.
Замечание:
Данные имена констант можно использовать в файле php.ini но не вне PHP,
как например в файле httpd.conf, где вместо них необходимо использовать значения их
битовых масок.
Значение | Константа | Описание | Примечание |
---|---|---|---|
1 |
E_ERROR (int) |
Фатальные ошибки времени выполнения. Это неустранимые средствами самого скрипта ошибки, такие как ошибка распределения памяти и т.п. Выполнение скрипта в таком случае прекращается. |
|
2 |
E_WARNING (int) |
Предупреждения времени выполнения (не фатальные ошибки). Выполнение скрипта в таком случае не прекращается. |
|
4 |
E_PARSE (int) |
Ошибки на этапе компиляции. Должны генерироваться только парсером. |
|
8 |
E_NOTICE (int) |
Уведомления времени выполнения. Указывают на то, что во время выполнения скрипта произошло что-то, что может указывать на ошибку, хотя это может происходить и при обычном выполнении программы. |
|
16 |
E_CORE_ERROR (int) |
Фатальные ошибки, которые происходят во время запуска РНР. Такие ошибки схожи сE_ERROR , за исключением того, что они генерируются ядром PHP.
|
|
32 |
E_CORE_WARNING (int) |
Предупреждения (не фатальные ошибки), которые происходят во время начального запуска РНР. Такие предупреждения схожи с E_WARNING , за исключением того,что они генерируются ядром PHP. |
|
64 |
E_COMPILE_ERROR (int) |
Фатальные ошибки на этапе компиляции. Такие ошибки схожи с E_ERROR , за исключением того,что они генерируются скриптовым движком Zend. |
|
128 |
E_COMPILE_WARNING (int) |
Предупреждения на этапе компиляции (не фатальные ошибки). Такие предупреждения схожи с E_WARNING , заисключением того, что они генерируются скриптовым движком Zend. |
|
256 |
E_USER_ERROR (int) |
Сообщения об ошибках, сгенерированные пользователем. Такие ошибки схожи с E_ERROR , за исключениемтого, что они генерируются в коде скрипта средствами функции PHP trigger_error(). |
|
512 |
E_USER_WARNING (int) |
Предупреждения, сгенерированные пользователем. Такие предупреждения схожи с E_WARNING ,за исключением того, что они генерируются в коде скрипта средствами функции PHP trigger_error(). |
|
1024 |
E_USER_NOTICE (int) |
Уведомления, сгенерированные пользователем. Такие уведомления схожи с E_NOTICE , за исключением того,что они генерируются в коде скрипта, средствами функции PHP trigger_error(). |
|
2048 |
E_STRICT (int) |
Включаются для того, чтобы PHP предлагал изменения в коде, которые обеспечат лучшее взаимодействие и совместимость кода. |
|
4096 |
E_RECOVERABLE_ERROR (int) |
Фатальные ошибки с возможностью обработки. Такие ошибки указывают, что, вероятно, возникла опасная ситуация, но при этом, скриптовый движок остаётся в стабильном состоянии. Если такая ошибка не обрабатывается функцией, определённой пользователем для обработки ошибок (смотрите set_error_handler()), выполнение приложения прерывается, как происходит при ошибках E_ERROR .
|
|
8192 |
E_DEPRECATED (int) |
Уведомления времени выполнения об использовании устаревших конструкций. Включаются для того, чтобы получать предупреждения о коде, который не будет работать в следующих версиях PHP. |
|
16384 |
E_USER_DEPRECATED (int) |
Уведомления времени выполнения об использовании устаревших конструкций, сгенерированные пользователем. Такие уведомления схожи с E_DEPRECATED за исключением того,что они генерируются в коде скрипта, с помощью функции PHP trigger_error(). |
|
32767 |
E_ALL (int) |
Все поддерживаемые ошибки, предупреждения и замечания. |
Представленные выше значения (как числовые, так и символьные)
используются для задания битовой маски, определяющей об ошибках
какого типа будет даваться отчёт. Вы можете использовать
побитовые операторы,
чтобы совмещать эти значения для указания определённых типов ошибок.
Стоит отметить, что в php.ini допустимы только следующие
операторы: ‘|’, ‘~’, ‘!’, ‘^’ и ‘&’.
russthom at fivegulf dot com ¶
10 years ago
[Editor's note: fixed E_COMPILE_* cases that incorrectly returned E_CORE_* strings. Thanks josiebgoode.]
The following code expands on Vlad's code to show all the flags that are set. if not set, a blank line shows.
<?php
$errLvl = error_reporting();
for ($i = 0; $i < 15; $i++ ) {
print FriendlyErrorType($errLvl & pow(2, $i)) . "<br>\n";
}
function
FriendlyErrorType($type)
{
switch($type)
{
case E_ERROR: // 1 //
return 'E_ERROR';
case E_WARNING: // 2 //
return 'E_WARNING';
case E_PARSE: // 4 //
return 'E_PARSE';
case E_NOTICE: // 8 //
return 'E_NOTICE';
case E_CORE_ERROR: // 16 //
return 'E_CORE_ERROR';
case E_CORE_WARNING: // 32 //
return 'E_CORE_WARNING';
case E_COMPILE_ERROR: // 64 //
return 'E_COMPILE_ERROR';
case E_COMPILE_WARNING: // 128 //
return 'E_COMPILE_WARNING';
case E_USER_ERROR: // 256 //
return 'E_USER_ERROR';
case E_USER_WARNING: // 512 //
return 'E_USER_WARNING';
case E_USER_NOTICE: // 1024 //
return 'E_USER_NOTICE';
case E_STRICT: // 2048 //
return 'E_STRICT';
case E_RECOVERABLE_ERROR: // 4096 //
return 'E_RECOVERABLE_ERROR';
case E_DEPRECATED: // 8192 //
return 'E_DEPRECATED';
case E_USER_DEPRECATED: // 16384 //
return 'E_USER_DEPRECATED';
}
return "";
}
?>
Andy at Azurite (co uk) ¶
11 years ago
-1 is also semantically meaningless as a bit field, and only works in 2s-complement numeric representations. On a 1s-complement system -1 would not set E_ERROR. On a sign-magnitude system -1 would set nothing at all! (see e.g. http://en.wikipedia.org/wiki/Ones%27_complement)
If you want to set all bits, ~0 is the correct way to do it.
But setting undefined bits could result in undefined behaviour and that means *absolutely anything* could happen :-)
fadhilinjagi at gmail dot com ¶
1 year ago
A simple and neat way to get the error level from the error code. You can even customize the error level names further.
<?php
$exceptions = [
E_ERROR => "E_ERROR",
E_WARNING => "E_WARNING",
E_PARSE => "E_PARSE",
E_NOTICE => "E_NOTICE",
E_CORE_ERROR => "E_CORE_ERROR",
E_CORE_WARNING => "E_CORE_WARNING",
E_COMPILE_ERROR => "E_COMPILE_ERROR",
E_COMPILE_WARNING => "E_COMPILE_WARNING",
E_USER_ERROR => "E_USER_ERROR",
E_USER_WARNING => "E_USER_WARNING",
E_USER_NOTICE => "E_USER_NOTICE",
E_STRICT => "E_STRICT",
E_RECOVERABLE_ERROR => "E_RECOVERABLE_ERROR",
E_DEPRECATED => "E_DEPRECATED",
E_USER_DEPRECATED => "E_USER_DEPRECATED",
E_ALL => "E_ALL"
];
echo
$exceptions["1"];
$code = 256;
echo $exceptions[$code];
?>
Output:
E_ERROR
E_USER_ERROR
This will need updating when PHP updates the error level names. Otherwise, it works just fine.
cl at viazenetti dot de ¶
5 years ago
An other way to get all PHP errors that are set to be reported. This code will even work, when additional error types are added in future.
<?php
$pot = 0;
foreach (array_reverse(str_split(decbin(error_reporting()))) as $bit) {
if ($bit == 1) {
echo array_search(pow(2, $pot), get_defined_constants(true)['Core']). "<br>n";
}
$pot++;
}
?>
bbrokman at gmail dot com ¶
3 years ago
A neat way to have a place in code to control error reporting configuration :)
<?php
$errorsActive
= [
E_ERROR => FALSE,
E_WARNING => TRUE,
E_PARSE => TRUE,
E_NOTICE => TRUE,
E_CORE_ERROR => FALSE,
E_CORE_WARNING => FALSE,
E_COMPILE_ERROR => FALSE,
E_COMPILE_WARNING => FALSE,
E_USER_ERROR => TRUE,
E_USER_WARNING => TRUE,
E_USER_NOTICE => TRUE,
E_STRICT => FALSE,
E_RECOVERABLE_ERROR => TRUE,
E_DEPRECATED => FALSE,
E_USER_DEPRECATED => TRUE,
E_ALL => FALSE,
];error_reporting(
array_sum(
array_keys($errorsActive, $search = true)
)
);?>
kaioker ¶
1 year ago
super simple error code to human readable conversion:
function prettycode($code){
return $code == 0 ? "FATAL" : array_search($code, get_defined_constants(true)['Core']);
}
ahsankhatri1992 at gmail ¶
6 years ago
Notes posted above limited to current errors level as on 26th Aug 2016, following snippet will work even on introduction of new error level
$errLvl = error_reporting();
for ( $i = 1; $i < E_ALL; $i*=2 )
{
print FriendlyErrorType($errLvl & $i) . "<br>n";
}
function FriendlyErrorType($type)
{
switch($type)
{
case E_ERROR: // 1 //
return 'E_ERROR';
case E_WARNING: // 2 //
return 'E_WARNING';
case E_PARSE: // 4 //
return 'E_PARSE';
case E_NOTICE: // 8 //
return 'E_NOTICE';
case E_CORE_ERROR: // 16 //
return 'E_CORE_ERROR';
case E_CORE_WARNING: // 32 //
return 'E_CORE_WARNING';
case E_COMPILE_ERROR: // 64 //
return 'E_COMPILE_ERROR';
case E_COMPILE_WARNING: // 128 //
return 'E_COMPILE_WARNING';
case E_USER_ERROR: // 256 //
return 'E_USER_ERROR';
case E_USER_WARNING: // 512 //
return 'E_USER_WARNING';
case E_USER_NOTICE: // 1024 //
return 'E_USER_NOTICE';
case E_STRICT: // 2048 //
return 'E_STRICT';
case E_RECOVERABLE_ERROR: // 4096 //
return 'E_RECOVERABLE_ERROR';
case E_DEPRECATED: // 8192 //
return 'E_DEPRECATED';
case E_USER_DEPRECATED: // 16384 //
return 'E_USER_DEPRECATED';
}
return "";
}
kezzyhko at NOSPAM dot semysha dot ru ¶
6 years ago
As for me, the best way to get error name by int value is that. And it's works fine for me ;)
<?php
array_flip
(array_slice(get_defined_constants(true)['Core'], 1, 15, true))[$type];//the same in readable form
array_flip(
array_slice(
get_defined_constants(true)['Core'],
1,
15,
true
)
)[$type]?>
ErikBachmann ¶
3 years ago
A shorter version of vladvarna's FriendlyErrorType($type)
<?php
function getErrorTypeByValue($type) {
$constants = get_defined_constants(true);
foreach (
$constants['Core'] as $key => $value ) { // Each Core constant
if ( preg_match('/^E_/', $key ) ) { // Check error constants
if ( $type == $value )
return( "$key=$value");
}
}
} // getErrorTypeByValue() echo "[".getErrorTypeByValue( 1 ) . "]". PHP_EOL;
echo "[".getErrorTypeByValue( 0 ) . "]". PHP_EOL;
echo "[".getErrorTypeByValue( 8 ) . "]". PHP_EOL;
?>
Will give
[E_ERROR=1]
[]
[E_NOTICE=8]
Anonymous ¶
6 years ago
My version!
For long list function returns for example "E_ALL without E_DEPRECATED "
function errorLevel()
{
$levels = array(
'E_ERROR',
'E_WARNING',
'E_PARSE',
'E_NOTICE',
'E_CORE_ERROR',
'E_CORE_WARNING',
'E_COMPILE_ERROR',
'E_COMPILE_WARNING',
'E_USER_ERROR',
'E_USER_WARNING',
'E_USER_NOTICE',
'E_STRICT',
'E_RECOVERABLE_ERROR',
'E_DEPRECATED',
'E_USER_DEPRECATED',
'E_ALL'
);
$excluded = $included = array();
$errLvl = error_reporting();
foreach ($levels as $lvl) {
$val = constant($lvl);
if ($errLvl & $val) {
$included []= $lvl;
} else {
$excluded []= $lvl;
}
}
if (count($excluded) > count($included)) {
echo '<br />Consist: '.implode(',', $included);
} else {
echo '<br />Consist: E_ALL without '.implode(',', $excluded);
}
}
vladvarna at gmail dot com ¶
10 years ago
function FriendlyErrorType($type)
{
switch($type)
{
case E_ERROR: // 1 //
return 'E_ERROR';
case E_WARNING: // 2 //
return 'E_WARNING';
case E_PARSE: // 4 //
return 'E_PARSE';
case E_NOTICE: // 8 //
return 'E_NOTICE';
case E_CORE_ERROR: // 16 //
return 'E_CORE_ERROR';
case E_CORE_WARNING: // 32 //
return 'E_CORE_WARNING';
case E_CORE_ERROR: // 64 //
return 'E_COMPILE_ERROR';
case E_CORE_WARNING: // 128 //
return 'E_COMPILE_WARNING';
case E_USER_ERROR: // 256 //
return 'E_USER_ERROR';
case E_USER_WARNING: // 512 //
return 'E_USER_WARNING';
case E_USER_NOTICE: // 1024 //
return 'E_USER_NOTICE';
case E_STRICT: // 2048 //
return 'E_STRICT';
case E_RECOVERABLE_ERROR: // 4096 //
return 'E_RECOVERABLE_ERROR';
case E_DEPRECATED: // 8192 //
return 'E_DEPRECATED';
case E_USER_DEPRECATED: // 16384 //
return 'E_USER_DEPRECATED';
}
return $type;
}
PhpMyCoder ¶
12 years ago
Well, technically -1 will show all errors which includes any new ones included by PHP. My guess is that E_ALL will always include new error constants so I usually prefer:
<?php
error_reporting(E_ALL | E_STRICT);
?>
Reason being: With a quick glance anyone can tell you what errors are reported. -1 might be a bit more cryptic to newer programmers.
Anonymous ¶
10 years ago
this would give you all the reported exception list of your configuration.
<?php
function FriendlyErrorType($type)
{
$return ="";
if($type & E_ERROR) // 1 //
$return.='& E_ERROR ';
if($type & E_WARNING) // 2 //
$return.='& E_WARNING ';
if($type & E_PARSE) // 4 //
$return.='& E_PARSE ';
if($type & E_NOTICE) // 8 //
$return.='& E_NOTICE ';
if($type & E_CORE_ERROR) // 16 //
$return.='& E_CORE_ERROR ';
if($type & E_CORE_WARNING) // 32 //
$return.='& E_CORE_WARNING ';
if($type & E_COMPILE_ERROR) // 64 //
$return.='& E_COMPILE_ERROR ';
if($type & E_COMPILE_WARNING) // 128 //
$return.='& E_COMPILE_WARNING ';
if($type & E_USER_ERROR) // 256 //
$return.='& E_USER_ERROR ';
if($type & E_USER_WARNING) // 512 //
$return.='& E_USER_WARNING ';
if($type & E_USER_NOTICE) // 1024 //
$return.='& E_USER_NOTICE ';
if($type & E_STRICT) // 2048 //
$return.='& E_STRICT ';
if($type & E_RECOVERABLE_ERROR) // 4096 //
$return.='& E_RECOVERABLE_ERROR ';
if($type & E_DEPRECATED) // 8192 //
$return.='& E_DEPRECATED ';
if($type & E_USER_DEPRECATED) // 16384 //
$return.='& E_USER_DEPRECATED ';
return substr($return,2);
}
echo "error_reporting = " . FriendlyErrorType(ini_get('error_reporting')) .";<br>";
?>
Herbert ¶
6 years ago
if you want to bring this list back to the categories error/warning/notice/all
<?php
$error_level
= 'warning'; // Allowed values: error/warning/notice/all$error_error = (int) E_ERROR | E_USER_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_RECOVERABLE_ERROR | E_PARSE;
$error_warning = (int) $error_error | E_WARNING | E_USER_WARNING | E_CORE_WARNING | E_COMPILE_WARNING;
$error_notice = (int) $error_warning | E_NOTICE | E_USER_NOTICE | E_DEPRECATED | E_USER_DEPRECATED;
$error_all = (int) $error_notice | E_STRICT;error_reporting ($GLOBALS["error_$error_level"]);?>
espertalhao04 at hotmail dot com ¶
5 years ago
A simplified way of writting a function to return a (non-optimal) representation of the error code as a bitwise string:
<?php
function readable_error_type($error_code)
{
$constants = array();
foreach(get_defined_constants() as $key => $value)
{
if(strpos($key, 'E_') === 0 && ($value <= $error_code) && ($value & $error_code))
{
$constants[] = $key;
}
}
return
implode(' | ', $constants);
}
?>
This only works for values above 0.
ilpaijin at gmail dot com ¶
5 years ago
The bitmask values relative to the Constant E_ALL is 30719, in case of PHP 5.6.x
damian at thebestisp dot dot dot com ¶
6 years ago
I saw that Chris seems to think that errors might be combined in some cases, I don't know of any cases, but his code is overly verbose, inefficient, and doesn't take into account future E_ constants. Here's my version of handling multiple errors (which probably wont ever happen) using my other code as a base. The only real difference is that this doesn't bother to split out undefined bits, which is pretty much useless and would get rather messy if you have more than a few bits set above 2**14 (0 to 14 have an associated error).
<?php
function friendly_error_type($type) {
static $levels=null;
if ($levels===null) {
$levels=[];
foreach (get_defined_constants() as $key=>$value) {
if (strpos($key,'E_')!==0) {continue;}
$levels[$value]=substr($key,2);
}
}
$out=[];
foreach ($levels as $int=>$string) {
if ($int&$type) {$out[]=$string;}
$type&=~$int;
}
if ($type) {$out[]="Error Remainder [{$type}]";}
return implode(' & ',$out);
}
echo friendly_error_type(E_ERROR|E_USER_DEPRECATED); //ERROR & USER_DEPRECATED
echo friendly_error_type(2**20-1); //ERROR & RECOVERABLE_ERROR & WARNING & PARSE & NOTICE & STRICT & DEPRECATED & CORE_ERROR & CORE_WARNING & COMPILE_ERROR & COMPILE_WARNING & USER_ERROR & USER_WARNING & USER_NOTICE & USER_DEPRECATED & Error Remainder [1015808]
?>
damian at thebestisp dot dot dot com ¶
6 years ago
I use this code to help mimic the default error handler, the only difference is that the levels end up being all caps, which I don't care to fix. You could also get rid of the underscores, but again, I don't care :P
Until php starts adding constants starting with E_ that have values overlapping with other E_ constants, this seems to be the shortest way of converting error code integers to strings understandable by meat bags. It will also work with new types, so that's nice.
<?php
function friendly_error_type($type) {
static $levels=null;
if ($levels===null) {
$levels=[];
foreach (get_defined_constants() as $key=>$value) {
if (strpos($key,'E_')!==0) {continue;}
$levels[$value]=substr($key,2);
}
}
return (isset($levels[$type]) ? $levels[$type] : "Error #{$type}");
}
echo friendly_error_type(1); #ERROR
echo friendly_error_type(2); #WARNING
echo friendly_error_type(3); #Error #3
?>
Tested on 5.6.12 and 7.0.3 (The first was by accident, didn't realize I was sshed into production :3)
chris-php at IGNORETHISPART dot cybermato dot com ¶
8 years ago
How about this? Unlike the examples below, it will show all the bits that are set, AND handle any bits defined in the future (at least not silently hide them)...
$strErrorType = "";
$bit = 1;
$tmpErrNo = $errNo;
while ($tmpErrNo) {
if ($tmpErrNo & $bit) {
if ($strErrorType != "")
$strErrorType .= " | ";
switch ($bit) {
case E_USER_WARNING:
$strErrorType .= "E_USER_WARNING"; break;
case E_USER_NOTICE:
$strErrorType .= "E_USER_NOTICE"; break;
case E_WARNING:
$strErrorType .= "E_WARNING"; break;
case E_CORE_WARNING:
$strErrorType .= "E_CORE_WARNING"; break;
case E_COMPILE_WARNING:
$strErrorType .= "E_COMPILE_WARNING"; break;
case E_NOTICE:
$strErrorType .= "E_NOTICE"; break;
case E_ERROR:
$strErrorType .= "E_ERROR"; break;
case E_PARSE:
$strErrorType .= "E_PARSE"; break;
case E_CORE_ERROR:
$strErrorType .= "E_CORE_ERROR"; break;
case E_COMPILE_ERROR:
$strErrorType .= "E_COMPILE_ERROR"; break;
case E_USER_ERROR:
$strErrorType .= "E_USER_ERROR"; break;
default:
$strErrorType .= "(unknown error bit $bit)"; break;
}
}
$tmpErrNo &= ~$bit;
$bit <<= 1;
}
I still vividly remember the first time I learned about PHP error handling.
It was in my fourth year of programming, my second with PHP, and I’d applied for a developer position at a local agency. The application required me to send in a code sample (GitHub as we know it didn’t exist back then) so I zipped and sent a simple custom CMS I’d created the previous year.
The email I got back from the person reviewing the code still chills my bones to this day.
«I was a bit worried about your project, but once I turned error reporting off, I see it actually works pretty well».
That was the first time I searched «PHP error reporting», discovered how to enable it, and died inside when I saw the stream of errors that were hidden from me before.
PHP errors and error reporting are something that many developers new to the language might miss initially. This is because, on many PHP based web server installations, PHP errors may be suppressed by default. This means that no one sees or is even aware of these errors.
For this reason, it’s a good idea to know where and how to enable them, especially for your local development environment. This helps you pick up errors in your code early on.
If you Google «PHP errors» one of the first results you will see is a link to the error_reporting function documentation.
This function allows you to both set the level of PHP error reporting, when your PHP script (or collection of scripts) runs, or retrieve the current level of PHP error reporting, as defined by your PHP configuration.
The error_reporting
function accepts a single parameter, an integer, which indicates which level of reporting to allow. Passing nothing as a parameter simply returns the current level set.
There is a long list of possible values you can pass as a parameter, but we’ll dive into those later.
For now it’s important to know that each possible value also exists as a PHP predefined constant. So for example, the constant E_ERROR
has the value of 1. This means you could either pass 1
, or E_ERROR
to the error_reporting function, and get the same result.
As a quick example, if we create a php_error_test.php
PHP script file, we can see the current error reporting level set, as well as set it to a new level.
<?php
// echo the current error reporting level
echo error_reporting();
<?php
// report all Fatal run-time errors.
echo error_reporting(1);
Error reporting configuration
Using the error_reporting
function in this way is great when you just want to see any errors related to the piece of code you’re currently working on.
But it would be better to control which errors are being reported on in your local development environment, and log them somewhere logical, to be able to review as you code. This can be done inside the PHP initialization (or php.ini
) file.
The php.ini
file is responsible for configuring all the aspects of PHP’s behavior. In it you can set things like how much memory to allocate to PHP scripts, what size file uploads to allow, and what error_reporting
level(s) you want for your environment.
If you’re not sure where your php.ini
file is located, one way to find out is to create a PHP script which uses the phpinfo function. This function will output all the information relative to your PHP install.
<?php
phpinfo();
As you can see from my phpinfo, my current php.ini
file is located at /etc/php/7.3/apache2/php.ini
.
Once you’ve found your php.ini
file, open it in your editor of choice, and search for the section called ‘Error handling and logging’. Here’s where the fun begins!
Error reporting directives
The first thing you’ll see in that section is a section of comments which include a detailed description of all the Error Level Constants. This is great, because you’ll be using them later on to set your error reporting levels.
Fortunately these constants are also documented in the online PHP Manual, for ease of reference.
Below this list is a second list of Common Values. This shows you how to set some commonly used sets of error reporting value combinations, including the default values, the suggested value for a development environment, and the suggested values for a production environment.
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
Finally, at the bottom of all the comments is the current value of your error_reporting
level. For local development, I’d suggest setting it to E_ALL
, so as to see all errors.
error_reporting = E_ALL
This is usually one of the first things I set when I set up a new development environment. That way I’ll see any and all errors that are reported.
After the error_reporting directive, there are some additional directives you can set. As before, the php.ini file includes descriptions of each directive, but I’ll give a brief description of the important ones below.
The display_errors
directive allows you to toggle whether PHP outputs the errors or not. I usually have this set to On, so I can see errors as they happen.
display_errors=On
The display_startup_errors
allows for the same On/Off toggling of errors that may occur during PHP’s startup sequence. These are typically errors in your PHP or web server configuration, not specifically your code. It’s recommended to leave this Off, unless you’re debugging a problem and you aren’t sure what’s causing it.
The log_errors
directive tells PHP whether or not to log errors to an error log file. This is always On by default, and is recommended.
The rest of the directives can be left as the default, except for maybe the error_log
directive, which allows you to specify where to log the errors, if log_errors
is on. By default it will log the errors wherever your web server has defined them to be logged.
Custom error logging
I use the Apache web server on Ubuntu, and my project-specific virtual host configurations use the following to determine the location for the error log.
ErrorLog ${APACHE_LOG_DIR}/project-error.log
This means it will log to the default Apache log directory, which is /var/log/apache2
, under a file called project-error.log
. Usually I replace project
with the name of the web project it relates to.
So, depending on your local development environment you may need to tweak this to suit your needs. Alternatively, if you can’t change this at the web server level, you can set it at the php.ini
level to a specific location.
error_log = /path/to/php.log
It is worth noting that this will log all PHP errors to this file, and if you’re working on multiple projects that might not be ideal. However, always knowing to check that one file for errors might work better for you, so your mileage may vary.
Find and fix those errors
If you’ve recently started coding in PHP, and you decide to turn error reporting on, be prepared to deal with the fallout from your existing code. You may see some things you didn’t expect, and need to fix.
The advantage though, is now that you know how to turn it all on at the server level, you can make sure you see these errors when they happen, and deal with them before someone else sees them!
Oh, and if you were wondering, the errors I was referring to at the start of this post were related to the fact that I was defining constants incorrectly, by not adding quotes around the constant name.
define(CONSTANT, 'Hello world.');
PHP allowed (and might still allow) this, but it would trigger a notice.
Notice: Use of undefined constant CONSTANT - assumed 'CONSTANT'
This notice was triggered every time I defined a constant, which for that project was about 8 or 9 times. Not great for someone to see 8 or 9 notices at the top of each page…
Learn to code for free. freeCodeCamp’s open source curriculum has helped more than 40,000 people get jobs as developers. Get started