ПредишенСледващото

Грешка при обработка на PHP.

Грешка Работа с trigger_error () и set_error_handler ()


PHP предоставя отлична възможност да наблюдават някакви грешки. Тук ние ще говорим за това как да се справят с грешка - доклад (или доклад) за инцидента на потребителя, ако е необходимо - да информира администратора чрез електронна поща, запишете информацията за инцидента в лог-файла.

Така че, на първо място, нека да се дефинира какво грешката в PHP.

PHP поддържа следните нива за грешки:

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_ALL
E_STRICT

В действителност - това е просто една константа, която се използва за да се определи нивото на обработка на грешки, изграждане на малко-маска. Константи са "говорещи" имена. С поглед към константа - можем да кажем, че грешка ниво E_PARSE се случва в случай на синтактична грешка, E_NOTICE - това е напомняне за програмист за нарушение "добър стил" програмиране в PHP.

Когато съединението с база MySQL база данни (или друга) не успее - преводач PHP информира грешка ниво E_WARNING

Предупреждение. mysql_connect (): Отказан достъп на потребител. "VVingless @ Localhost" (Използване на парола. ДА)
В / Начало / с уебсайт / индекс. PHP (линия 83)

Забележка: За да се PHP интерпретатор съобщава грешка - PHP трябва да бъде съответно конфигуриран: трябва да бъдат включени display_errors флаг - 1, error_reporting директива следва да се посочи, че е необходимо да се покаже грешка ниво E_WARNING (разбира се, че е желателно и други). Ако стойностите на тези директиви, не отговарят на вашите нужди - можете да се опитате да го инсталирате сами, поставени в папка с .htaccess скриптовия файл (точка в началото на името задължително) за съдържание:


php_flag display_errors на
php_value error_reporting "E_ALL

Това означава, че съобщенията за грешки се появяват и на всички нива, с изключение E_NOTICE
Когато програмистът позволява синтактична грешка - PHP интерпретатор съобщава E_PARSE ниво грешка


Разбор грешка: разбор грешка, неочаквано "(", очаквайки T_STRING в /home/mysite/index.php по линия 150

Но най-интересното за нас, процентът на грешките - E_USER_ERROR и E_USER_WARNING. Както става ясно от заглавието - това нивата на грешки, които могат да бъдат инсталирани от потребителя. За тази цел има функция trigger_error () - с негова помощ, можете да уведоми потребителя за инцидент като това прави PHP.

Както знаем от ръководството на PHP - trigger_error () функция може да отнеме два параметъра.

невалидни trigger_error (низ ERROR_MSG [, Int ERROR_TYPE])

Първият вариант - за текста на съобщението за грешка, като "Файлът не е намерен". Вторият вариант - определя нивото на грешки. trigger_error () функция работи само с грешка E_USER семейство - това означава, че можете да инсталирате грешка ниво E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE и не може да се установи E_WARNING ниво. Вторият параметър е по желание и по подразбиране е E_USER_NOTICE.

Да приемем, нашите данни за новинарски емисии, се съхраняват в news.txt файл, и ако файлът не е намерен - вие трябва да подадете сигнал за грешка. програма текст ще изглежда по следния начин:

ако (! file_exists ( "/ Начало / с уебсайт / news.txt")) trigger_error ( "News файл не е намерена");
>

В резултат на това на PHP интерпретатора ще докладва E_USER_NOTICE ниво грешка

Забележка: Новини файлът не е намерен в /home/mysite/index.php по линия 47
Но това, което ни дава това? Да започнем с това, че ако в php.ini или .htaccess файл, са инсталирани директива

php_value log_errors "1"
php_value log_errors_max_len "1024"
php_value error_log "/home/mysite/my.log"
/home/mysite/my.log във файла ще бъде автоматично добавени към записа на инцидента.

Както е известно от ръководството - в PHP 4 функция може да отнеме един-единствен параметър низ - името на функцията, която да се изпълнява винаги, когато възникне грешка. PHP 5 добавя възможност за задаване на още един параметър - вида на грешка, която ще се обработват с помощта на нашия треньор. Функцията връща низ - името на манипулатора, който е създаден, до този момент.

низ set_error_handler (обаждане error_handler [, Int error_types])

set_error_handler ( "my_error_handler");
Дефинирани от потребителя функция, която ще се занимава с грешката, може да предприеме следните входни параметри:

- код за грешка на ниво
- грешки устен низ
- името на файла, където е възникнала грешката
- Онлайн, където е възникнала грешката

Трябва също да се отбележи, че тази функция не може да се справи грешки E_ERROR нива, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING

Това се дължи на факта, че грешките, изброени нива, станали преди преводачът получава информация за манипулатор потребител грешка.

Ето защо, ние декларираме своята функция

функция my_error_handler ($ код, $ съобщ, $ файл, $ ред)>

Забележка: Всеки повече или по-малко обграждат сценария обикновено е разделен на няколко файла за удобство на работа с него. Как да се организира модулна програма - една тема на разговор на мира. Сега, аз просто искам да съветва да се разпределят общите настройки в отделен файл, който ще бъде свързан с началото на програмата, като се използва, включват обучение, или чрез директива auto_prepend_file. Този файл може да се постави и нашия манипулатор. Монтаж грешка манипулатор трябва да се реализира възможно най-близо до началото на програмата, е желателно, на първо място.
За да се уверите, че тя наистина работи - създаване на нов PHP файл и се опитайте да го стартирате

File Content myerrortest.php

функция my_error_handler ($ код. $ съобщ. $ файл. $ ред)

ехо "Възникна грешка $ съобщ ($ код)
п ";
ехо "$ файл ($ линия)";
>

ако (! file_exists ( "/home/mysite/news.txt")) <
trigger_error ( "News файл не е намерена");
>


В резултат на обработката на файла е:

Възникна грешка при новини Файлът не е намерен (1024)
/home/mysite/myerrortest.php (12)
Сега имаме една функция, която получава данни за всички настъпили грешки. Ние считаме, как можем да я използваме.

Ние ще обработим нивата на грешки
E_ERROR
E_WARNING
E_NOTICE
E_USER_ERROR
E_USER_NOTICE

Първите три грешки в добър завършен програма не трябва да се случват на всички, така че за тях ще уведомим само потребителския терминал на текста за грешка на екрана. Така че можете да работите, докато сценарият е в състояние да се развива, и след това да ги докладват, можете да деактивирате или да пишете на лог-файл.

Сега нашата функция е обработката на грешки ще изглежда по следния начин:

// малки настройки

// определен режим на дисплея грешка
// показване на всички грешки, с изключение E_NOTICE
error_reporting (E_ALL

// тази постоянна такса
// активиране / деактивиране на режим за отстраняване на грешки
// по време на отстраняване на грешки - съобщения не се изпращат
// по пощата, а просто отпечатва на екрана
определи ( "DEBUG" 0.);

// това е глобална променлива, която
// ще съхрани съобщението
// потребител трябва да видите
$ MSG = '';

// на регистрационните файлове
определи ( "LOGFILE '' /home/mysite/mylog.log.);

// времевата разлика от сървъра (в секунди)
определи ( "TIMEOFFSET" 0.);

функция my_error_handler ($ код. $ съобщ. $ файл. $ ред)
<
// глобална променлива, която ще бъде
// напишете съобщение за грешка.
глобалния $ MSG;

// пропуснете грешки на ниво E_NOTICE
// и да се игнорира за грешка, ако съобщенията за грешки, са деактивирани
ако (($ код == E_NOTICE) или (error_reporting () == 0)) <
се върне;
>

// ако са причинили нивото на грешка E_USER_NOTICE - просто
// напише текста на грешка в глобалната променлива $ от MSG
// и спиране на функцията

ако ($ код == E_USER_NOTICE) <
$ MSG = $ съоб;
Върнете;
>

// ако нивото на E_ERROR грешка - печат грешка текст
// и цялостно изпълнение на скрипта

ако ($ код == E_ERROR) <
умре ( "
ГРЕШКА: ". $ Съобщ. "
В ". $ Файла. "(Line". $ Line. ")
');
>

// ако нивото на грешка E_WARNING на - печат грешка текста
// и да се спре изпълнението на

ако ($ код == E_WARNING) <
ехо "
ВНИМАНИЕ: ". $ Съобщ. "
В ". $ Файла. "(Line". $ Line. ")
";
Върнете;
>

// ако нивото на грешка E_USER_ERROR

ако ($ код == E_USER_ERROR)

$ MSG = 'Критична грешка: Екшън Постигната дългове.

съобщение за грешка, е бил изпратен на разработчика. ;

// пиша подробности в текста на променливата $

$ = $ Текст съобщ. "
". "Файл". $ Файла. "(". $ Line. ');

// Ако константата на DEBUG е 1 - Информация за печат
// грешка на екрана - ако не, да изпратите текстово грешка поща
// функция error_mail () и пише в дневника - функция error_writelog ()

ако (DEBUG == 1) <
error_print ($ текст);
> още <
error_mail ($ текст);
error_writelog ($ текст);
>


// определи манипулатор
set_error_handler ( "my_error_handler ');

Сега ние се опише обслужващите функции


// IP-отпечатам грешка на екрана
функция error_print ($ текст)
<
ехо $ текст. "

";
>

// IP-и изпраща писмо за грешка
функция error_mail ($ текст)
<
$ Текст = str_replace ( "
"." N "$ текст) .;

$ Информация = "време". get_datetime (). "NRemote IP:". get_ip (). "N";

поща (.. ADM_EMAIL "Възникна грешка при подаването" $ текст информация $.);
>

// IP-пиша грешка в дневника
функция error_writelog ($ текст)
<
$ Текст = str_replace ( "
"." T "$ текст) .;
ако (@ $ FH = fopen (LOGFILE. "а +")) <
fputs (... $ FH get_datetime () "т" get_ip () "т" $ текст "п" ...);
fclose ($ FH);
>
>


// получи време, като се има предвид разликата във времето
функция get_time ()
<
връщане (дата ( "Н и" време () + TIMEOFFSET).);
>

// получите датата, като се има предвид разликата във времето
функция get_date ()
<
връщане (дата ( "Y-т-г" време () + TIMEOFFSET).);
>

// получи дата и час, като се има предвид разликата във времето
функция get_datetime ()
<
върнете get_date (). ''. get_time ();
>

// получите IP
функция get_ip ()
<
върне ($ _SERVER [ 'REMOTE_ADDR']);
>
Накрая, един пример за използване

// IP-и пише новини файл
функционални write_news ($ заглавие. $ текст)
<
$ News_file = '/home/mysite/news.txt ";

// проверите наличието на заглавие - грешката не е от решаващо значение
ако (! отрежете ($ заглавие))

// да се определи, че функцията завърши
// недостатъчност - трябва да се върнете невярно. функция
// trigger_error () - връща истина, ние ще
// връща резултат на своята обърната

се върне. trigger_error ( 'Трябва да въведете заглавие новини ");
>

// проверите наличието на текст новини - грешката не е от решаващо значение
ако (! отрежете ($ текст)) <
се върне. trigger_error ( "Трябва да посочите текст на новината ');
>

// проверява дали файлът, към който пишем
// ако не може да се намери файла - критична грешка

ако (! file_exists ($ news_file)) <
се върне. trigger_error ( "база данни, файл новини не може да бъде намерен! E_USER_ERROR.);
>

//. след предварителна обработка на данни.

// пишат новините
$ Fh = fopen ($ news_file "а +".);
fputs ($ FH $ заглавие "т" $ текст "п" ....);
fclose ($ FH);

// ако всичко върви добре - функцията връща истинското
върнете вярно;
>

// опитам да напиша новината
// тази информация може да дойде от уеб-форма

$ Res = write_news ( "Моите новини" "текстови ми новини".);

// ако се върна фалшива - грешка печат
ехо $ MSG;

// ако всичко това е прав - можете да го докладвате
// по-добра потребителска otforvardit някъде.
ехо "News е добавен";
>

Това е доста прост пример, темата може да се развива.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!