- Как настроить отображение ошибок в PHP
- Как быстро показать все ошибки PHP
- Что именно делают эти строки?
- Отображение ошибок PHP через настройки в php.ini
- Отображать ошибки PHP через настройки в .htaccess
- Включить подробные предупреждения и уведомления
- Более подробно о функции error_reporting ()
- Включить ошибки php в файл с помощью функции error_log ()
- Журнал ошибок PHP через конфигурацию веб-сервера
- php не возвращает ошибки
- И наступило утро..
- error_reporting
- Описание
- Список параметров
- Возвращаемые значения
- Список изменений
- Примеры
- Примечания
- Смотрите также
- User Contributed Notes 27 notes
Как настроить отображение ошибок в PHP
В этом руководстве мы расскажем о различных способах того, как в PHP включить вывод ошибок. Мы также обсудим, как записывать ошибки в журнал (лог).
Как быстро показать все ошибки PHP
Самый быстрый способ отобразить все ошибки и предупреждения php — добавить эти строки в файл PHP:
Что именно делают эти строки?
Функция ini_set попытается переопределить конфигурацию, найденную в вашем ini-файле PHP.
Displayerrors и displaystartuperrors — это только две из доступных директив. Директива displayerrors определяет, будут ли ошибки отображаться для пользователя. Обычно директива dispay_errors не должна использоваться для «боевого» режима работы сайта, а должна использоваться только для разработки.
displaystartuperrors — это отдельная директива, потому что displayerrors не обрабатывает ошибки, которые будут встречаться во время запуска PHP. Список директив, которые могут быть переопределены функцией iniset, находится в официальной документации .
К сожалению, эти две директивы не смогут отображать синтаксические ошибки, такие как пропущенные точки с запятой или отсутствующие фигурные скобки.
Отображение ошибок PHP через настройки в php.ini
Если ошибки в браузере по-прежнему не отображаются, то добавьте директиву:
Директиву displayerrors следует добавить в ini-файл PHP. Она отобразит все ошибки, включая синтаксические ошибки, которые невозможно отобразить, просто вызвав функцию iniset в коде PHP.
Актуальный INI-файл можно найти в выводе функции phpinfo (). Он помечен как «загруженный файл конфигурации» («loaded configuration file»).
Отображать ошибки PHP через настройки в .htaccess
Включить или выключить отображение ошибок можно и с помощью файла .htaccess, расположенного в каталоге сайта.
.htaccess также имеет директивы для displaystartuperrors и display_errors.
Вы можете настроить displayerrors в .htaccess или в вашем файле PHP.ini. Однако многие хостинг-провайдеры не разрешают вам изменять ваш файл PHP.ini для включения displayerrors.
В файле .htaccess также можно включить настраиваемый журнал ошибок, если папка журнала или файл журнала доступны для записи. Файл журнала может быть относительным путем к месту расположения .htaccess или абсолютным путем, например /var/www/html/website/public/logs .
Включить подробные предупреждения и уведомления
Иногда предупреждения приводят к некоторым фатальным ошибкам в определенных условиях. Скрыть ошибки, но отображать только предупреждающие (warning) сообщения можно вот так:
Для отображения предупреждений и уведомлений укажите «EWARNING | ENOTICE».
Также можно указать EERROR, EWARNING, EPARSE и ENOTICE в качестве аргументов. Чтобы сообщить обо всех ошибках, кроме уведомлений, укажите «EALL &
ENOTICE», где EALL обозначает все возможные параметры функции errorreporting.
Более подробно о функции error_reporting ()
Функция сообщения об ошибках — это встроенная функция PHP, которая позволяет разработчикам контролировать, какие ошибки будут отображаться. Помните, что в PHP ini есть директива error_reporting, которая будет задана этой функцией во время выполнения.
Для удаления всех ошибок, предупреждений, сообщений и уведомлений передайте в функцию error_reporting ноль. Можно сразу отключить сообщения отчетов в ini-файле PHP или в .htaccess:
PHP позволяет использовать переменные, даже если они не объявлены. Это не стандартная практика, поскольку необъявленные переменные будут вызывать проблемы для приложения, если они используются в циклах и условиях.
Иногда это также происходит потому, что объявленная переменная имеет другое написание, чем переменная, используемая для условий или циклов. Когда ENOTICE передается в функцию errorreporting, эти необъявленные переменные будут отображаться.
Функция сообщения об ошибках позволяет вам фильтровать, какие ошибки могут отображаться. Символ «
» означает «нет», поэтому параметр
E_NOTICE означает не показывать уведомления. Обратите внимание на символы «&» и «|» между возможными параметрами. Символ «&» означает «верно для всех», в то время как символ «|» представляет любой из них, если он истинен. Эти два символа имеют одинаковое значение в условиях PHP OR и AND.
Эти три строки кода делают одно и то же, они будут отображать все ошибки PHP. Errorreporting(EALL) наиболее широко используется разработчиками для отображения ошибок, потому что он более читабелен и понятен.
Включить ошибки php в файл с помощью функции error_log ()
У сайта на хостинге сообщения об ошибках не должны показываться конечным пользователям, но эта информация все равно должна быть записана в журнал (лог).
Простой способ использовать файлы журналов — использовать функцию error_log, которая принимает четыре параметра. Единственный обязательный параметр — это первый параметр, который содержит подробную информацию об ошибке или о том, что нужно регистрировать. Тип, назначение и заголовок являются необязательными параметрами.
Параметр type, если он не определен, будет по умолчанию равен 0, что означает, что эта информация журнала будет добавлена к любому файлу журнала, определенному на веб-сервере.
Параметр 1 отправит журнал ошибок на почтовый ящик, указанный в третьем параметре. Чтобы эта функция работала, PHP ini должен иметь правильную конфигурацию SMTP, чтобы иметь возможность отправлять электронные письма. Эти SMTP-директивы ini включают хост, тип шифрования, имя пользователя, пароль и порт. Этот вид отчетов рекомендуется использовать для самых критичных ошибок.
Для записи сообщений в отдельный файл необходимо использовать тип 3. Третий параметр будет служить местоположением файла журнала и должен быть доступен для записи веб-сервером. Расположение файла журнала может быть относительным путем к тому, где этот код вызывается, или абсолютным путем.
Журнал ошибок PHP через конфигурацию веб-сервера
Лучший способ регистрировать ошибки — это определить их в файле конфигурации веб-сервера.
Однако в этом случае вам нужно попросить администратора сервера добавить следующие строки в конфигурацию.
Пример для Apache:
В nginx директива называется error_log.
Теперь вы знаете, как в PHP включить отображение ошибок. Надеемся, что эта информация была вам полезна.
Источник
php не возвращает ошибки
Проблема. Специально допускаю синтаксическую ошибку в php, в браузере пустой лист. ошибок нет, php работает нормально. В лог тоже не пишет.
в php.ini: error_reporting = E_ALL | E_STRICT display_errors = On log_errors = On error_log = /etc/home/user/mylog/php_errors.log error_reporting = E_ALL display_startup_errors = On log_errors_max_len = 1024 путь до ini смотрел проверял через phpinfo();
в .htaccess и в коде вывод ошибок не запрещал.
обсуждение уже поднимал тутhttp://forum.ubuntu.ru/index.php?topic=122048.0, пока ответа не получил. Надеюсь здесь найду помощь.
почему error_reporting установлен 2 раза? как можно так относиться к конфигам? оставь только error_reporting = E_ALL
по теме — чудес не бывает. если у тебя пхп подключен как модуль апача, значит, ты забыл рестартануть апач после исправления конфига. возможно, ты настроил не тот конфиг (например, для cgi, а надо /etc/php5/apache2/php.ini). чтоб ошибки писались в файлы, надо убедиться, что пользователю апача разрешен в них доступ.
Ты где-то ошибку допустил в конфиге. Такого не может быть. Либо не тот конфиг выбрал.
Или в том коде, который ты используеш, выключён показ ошибок
ты забыл рестартануть апач после исправления конфига
уж не первый мучаюсь, так что перегружал сотню раз. Права на логи проверял. Настройки которые я делаю видны в phpinfo(); поэтому «не тот» php.ini тоже отпадает. До сегодня грешил на небольшой срок опыта администрирования apache под nix. Но сейчас больше похоже на то что это конфликт с другой программой (что я искренне думал на линуксе исключено. ) либо это уже волшебство.
Вы подтолкните плз где рыть, какие логи может показать. У меня уже сил нет, волшебство какоето.
Дерево сайта: test.loc(chmod 777)/index.php(chmod 666) (других файлов нет)
Что еще надо показать, вроде все что вспомнил.
Да вот еще. /etc/apache2/sites-available/test.loc
сим линк в sites-enabled присутствует, конечно же.
Всем огромное спасибо. Было очень приятно получить поддержку когда уже нет сил. Как ни странно дело было в 10 строчках коммента в файле sites-available/test.loc . Убрал — все заработало.
мммм. а что за коммент там был, что ОН ПОВЛЕЯЛ?
И наступило утро..
Вот комментарий, просто шпаргалку оставлял.
Но на утро все вновь перестало работать. Уже без комментария. Блин, ума не приложу что же могло произойти. Такое ощущение, что ubuntu меня просто спасть отправила, чтобы я ее не задалбливал.
Ведь ничего не менял, как вечером комент удалил, сервер перегрузил, увидел что все работает, отписался на фруме, выключил комп. Сутра включил проверить не приснилось ли мне, и . видимо приснилось.
Судя по тому что и без комента теперь не работает, дело было не в коменте, что с сервером могло произойти после перезагрузки?
1) Ось какая? В венде ошибки могут перенаправляться в системный лог, который надо смотреть через EventViewer (правой кнопкой по «моему компьютеру», пункт «управление», потом «журнал событий» (или как-то так), и там уже роешься).
2) Что говорит phpinfo? Параметр error_reporting тупо не прочитался из конфига, или прочитался но не используется?
3) Чем запускаешь сервак — скриптами из /etc/rc.d/, через apachectl, напрямую экзешник? //т.е. поройся в своих скриптах и глянь насколько извращенским способом запускается апач
4) Сервак действительно имеет права писать логи туда, куда должен их писать?
5) Есть какие-нибудь критические ошибки самого сервака или PHP при старте? Типа «аааа, php5: segmentation fault» или типа того
6) В слову E_STRICT буква C написана по русски или по-английски? )))
7) Если конфиг скопирасчен с вендового PHP — проверить переносы строк, а лучше взять сразу линуксовый шаблон
. ну и еще тыщи разных)
10) Попробуй пересобрать апач и/или PHP из исходников в хомячке. Проверь, заработало ли.
>Права на логи проверял.
на /etc/home/user/mylog/php_errors.log тоже? Там вообще что-нибудь есть?
Ого, мне лесно, что ответ поступил от самого Джобса 🙂
2. Читается, при внесении изменения все меняется
3. /etc/init.d/apache2 start
5. Логи я описал выше.
6. copy — past не ошибается
7. Вот этот совет натолкнул на мысль, которая и сработала. Об этом ниже.
10. Пробовал, исход тотже, даже на чистой системе.
Вобщем дело в параметре AllowOverridе, видимо я пока настраивал вчера, случайно убил mode_rewrite. Сегодня же я специально поменял AllowOverride All на AllowOverride None. Ошибки сразу заискрили на экране :).
modrewrite мне очень нужен, я его при настройке всегда сразу включал (я же не подозревал что такое может быть. )
Теперь вопрос, почему modrewrite конфликтует с выводом ошибок PHP?
А по пути от корня ФС к корню сайта нигде .htaccess не завалялся? В нём может быть что-то вида
php_value error_reporting 0
php_flag display_errors Off
которые переопределяют значения в php.ini.
А вообще, как правильно посоветовали, смотрите выхлоп phpinfo() на предмет того, подхватились ли настройки из конфигов и какие конфиги PHP читает.
Тоже мучаюсь. Все по дефолту, кроме прав на /var/www.
кто пишет логи в etc? в /var же надо писать
Посмотрите, не встречается в php.ini ниже еще одна директива display_errors = Off
путь до ini смотрел проверял через phpinfo();
А значения переменных соответствуют предполагаемым (в выдаче phpinfo)? Ты же понимаешь, чудес не бывает.
Источник
error_reporting
(PHP 4, PHP 5, PHP 7, PHP 8)
error_reporting — Задаёт, какие ошибки PHP попадут в отчёт
Описание
Функция error_reporting() задаёт значение директивы error_reporting во время выполнения. В PHP есть много уровней ошибок. Используя эту функцию, можно задать уровень ошибок времени выполнения скрипта, которые попадут в отчёт. Если необязательный аргумент error_level не задан, error_reporting() вернёт текущее значение уровня протоколирования ошибок.
Список параметров
Новое значение уровня error_reporting. Это может быть битовая маска или именованные константы. При использовании именованных констант нужно будет следить за совместимостью с новыми версиями PHP. В новых версиях могут добавиться новые уровни ошибок, увеличиться диапазон целочисленных типов. Все это может привести к нестабильной работе при использовании старых целочисленных обозначений уровней ошибок.
Доступные константы уровней ошибок и их описания приведены в разделе Предопределённые константы.
Возвращаемые значения
Возвращает старое значение уровня error_reporting либо текущее значение, если аргумент error_level не задан.
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 | error_level теперь допускает значение null. |
Примеры
Пример #1 Примеры использования error_reporting()
// Выключение протоколирования ошибок
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 &
// Добавлять в отчёт все ошибки PHP
error_reporting ( E_ALL );
// Добавлять в отчёт все ошибки PHP
error_reporting (- 1 );
// То же, что и error_reporting(E_ALL);
ini_set ( ‘error_reporting’ , E_ALL );
Примечания
Если передать -1 , будут отображаться все возможные ошибки, даже если в новых версиях PHP добавятся уровни или константы. Поведение эквивалентно передаче константы E_ALL .
Смотрите также
User Contributed Notes 27 notes
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:
( 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!
Under PHP 8.0, error_reporting() does not return 0 when then the code uses a @ character.
= $array [ 20 ]; // error_reporting() returns 0 in php =8
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 &
//.
$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.
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
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.
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:
( 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.
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.
E_NOTICE integer value is 6135
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.
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
To expand upon the note by chris at ocproducts dot com. If you prepend @ to error_reporting(), the function will always return 0.
( E_ALL );
var_dump (
error_reporting (), // value of E_ALL,
@ error_reporting () // value is 0
);
?>
To enable error reporting for *ALL* error messages including every error level (including E_STRICT, E_NOTICE etc.), simply use:
see more information about php 5.3 deprecated errors
I always code with E_ALL set.
After a couple of pages of
= (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.
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.
?>
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.
if ( substr ( $_SERVER [ ‘SERVER_NAME’ ], — 6 ) == ‘.local’ ) <
ini_set ( ‘display_errors’ , 1 );
ini_set ( ‘error_reporting’ , E_ALL );
// or error_reporting(E_ALL);
>
?>
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:
Источник