Eroare de manipulare în php

Eroare de manipulare în PHP.

Eroare de manipulare cu trigger_error () și set_error_handler ()


PHP oferă o oportunitate excelentă de a monitoriza erorile care apar. Aici vom vorbi despre modul de gestionare a erorii - de a raporta (sau de a nu raporta) incidentul către utilizator, dacă este necesar - pentru a anunța administratorul prin e-mail, pentru a înregistra informațiile despre incident în fișierul jurnal.

Deci, în primul rând, să definim ce erori sunt în PHP.

PHP suportă următoarele niveluri de eroare:

E_ERROR
E_WARNING
E_PARSE
E_NOTICE
E_CORE_ERROR
E_CORE_WARNING
E_COMPILE_ERROR
avertizate E_COMPILE_WARNING
E_USER_ERROR
E_USER_WARNING
E_USER_NOTICE
E_ALL
E_STRICT

De fapt, ele sunt doar constante care sunt folosite pentru a determina nivelul de manipulare a erorilor, construirea unei masti bitrate. Constantele au nume "vorbind". Privind la constanta - putem spune că eroarea de nivel E_PARSE apare în cazul unei erori de sintaxă, E_NOTICE - este un memento pentru programator cu privire la încălcarea „stil bun“ de programare în PHP.

Când conexiunea la baza de date MySQL (sau alta) nu reușește - interpretul PHP raportează nivelul de eroare E_WARNING

Avertizare. mysql_connect (): Accesul a fost refuzat pentru utilizator. 'VVingless @ localhost' (Utilizarea parolei.
În / home / mysite / index. php (linia 83)

Notă: Pentru a PHP interpret raportat eroare - PHP ar trebui să fie configurat în mod corespunzător: ar trebui să fie inclus display_errors pavilion - 1, error_reporting directivă ar trebui să indice faptul că este necesar să se afișeze eroare de nivel E_WARNING (desigur, este de dorit și altele). În cazul în care valorile acestor directive nu satisface nevoile dvs. - puteți încerca să-l instalați le pune într-un dosar cu fișierul .htaccess script-ul (punct la începutul numelui necesar) cu privire la acest conținut:


php_flag display_errors pe
php_value error_reporting "E_ALL

Aceasta înseamnă că vor apărea mesaje de eroare, cu toate nivelurile, cu excepția E_NOTICE
Când programatorul permite o eroare de sintaxă - interpretul PHP raportează un nivel de eroare E_PARSE


Parse error: parse error, neașteptate '(', așteptând T_STRING în /home/mysite/index.php pe linia 150

Dar cele mai interesante niveluri de eroare pentru noi sunt E_USER_ERROR și E_USER_WARNING. După cum rezultă din titlu, acestea sunt nivelurile de eroare pe care le poate seta utilizatorul. Pentru a face acest lucru, există o funcție trigger_error () - cu aceasta, puteți spune utilizatorului despre incident în același mod ca PHP.

După cum știți din manualul PHP, funcția trigger_error () are doi parametri.

void trigger_error (șirul error_msg [, int error_type])

Primul parametru este un mesaj text despre o eroare, de exemplu, "fișierul nu a fost găsit". Al doilea parametru determină nivelul de eroare. Funcția trigger_error () funcționează numai cu eroare de familie E_USER - înseamnă că puteți instala eroare de nivel E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE și nu se poate stabili un nivel E_WARNING. Al doilea parametru este opțional și implicit este E_USER_NOTICE.

De exemplu, datele noastre pentru un flux de știri sunt stocate în fișierul news.txt, iar dacă fișierul nu este găsit, trebuie să raportați o eroare. Textul programului va arăta astfel:

dacă (! file_exists ('/ home / mysite / news.txt')) trigger_error ("Fișierul de știri nu a fost găsit");
>

Ca rezultat, interpretul PHP va raporta un nivel de eroare de E_USER_NOTICE

Notă: fișierul de știri nu a fost găsit în /home/mysite/index.php pe linia 47
Dar ce ne dă asta? În primul rând, dacă fișierul php.ini sau .htaccess are directive

php_value log_errors "1"
php_value log_errors_max_len "1024"
php_value error_log "/home/mysite/my.log"
O intrare incident va fi adăugată automat în fișierul /home/mysite/my.log.

După cum știți din manual - în PHP 4, funcția are un singur parametru șir - numele funcției care va fi executată de fiecare dată când apare o eroare. PHP 5 face posibila setarea unui alt parametru - tipul de erori care vor fi tratate de manipulatorul nostru. Funcția returnează un șir - numele funcției de handler care a fost setat până la acest punct.

șir set_error_handler (callback error_handler [, int error_types])

set_error_handler ("my_error_handler");
O funcție definită de utilizator care va gestiona erorile poate lua următorii parametri de intrare:

- cod de eroare
- șir interpretare eroare
- numele fișierului în care a apărut eroarea
- linia în care a apărut eroarea

De asemenea, trebuie remarcat faptul că această funcție nu poate manipula erori E_ERROR niveluri, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, avertizate E_COMPILE_WARNING

Acest lucru se datorează faptului că erorile din nivelurile listate apar înainte ca interpretul să primească informații despre dispozitivul de eroare al utilizatorului.

Deci, ne declarăm funcția

funcția my_error_handler ($ code, $ msg, $ file, $ line)>

Notă: fiecare script mai mult sau mai puțin voluminoasă este de obicei împărțit în mai multe fișiere pentru a putea lucra cu acesta. Modul de organizare a modularității programului - subiectul unei conversații separate. Acum, vreau doar să sfătuiesc să aloce setările generale într-un fișier separat, care va fi conectat la începutul programului folosind includ instruirea, fie prin Directiva auto_prepend_file. În acest fișier, puteți pune mâna noastră. Instalarea dispozitivului de eroare trebuie implementată cât mai aproape posibil de începutul programului, de preferință chiar de la început.
Pentru a vă asigura că funcționează cu adevărat - creați un nou fișier PHP și încercați să îl rulați

Conținutul lui myerrortest.php

funcția my_error_handler ($ code. $ msg. $ file. $ line)

echo "A apărut o eroare în $ msg ($ code)
n ";
echo "$ file ($ line)";
>

dacă (! file_exists ('/home/mysite/news.txt')) <
trigger_error ("Fișierul de știri nu a fost găsit");
>


Rezultatul procesării acestui fișier va fi:

A apărut o eroare. Fișierul de știri nu a fost găsit (1024)
/home/mysite/myerrortest.php (12)
Acum avem o funcție care primește date despre toate erorile care apar. Să ne gândim cum putem să o folosim.

Ne vom ocupa de erori de nivel
E_ERROR
E_WARNING
E_NOTICE
E_USER_ERROR
E_USER_NOTICE

Primele trei erori dintr-un bun program finit nu ar trebui să apară deloc, așa că le vom raporta numai utilizatorilor prin afișarea textului erorii pe ecran. Deci, puteți lucra în timp ce scriptul este în starea de dezvoltare, atunci mesajele despre ele pot fi dezactivate sau scrise într-un fișier jurnal.

Acum, funcția noastră de gestionare a erorilor va arăta astfel:

// Puține presetări

// setați modul de afișare a erorilor
// afișați toate erorile, cu excepția E_NOTICE
error_reporting (E_ALL

// această constantă este responsabilă pentru
// activați / dezactivați modul de depanare
// în timpul depanării - nu au fost trimise mesaje
// prin poștă și doar imprimate pe ecran
define ('DEBUG'. 0);

// aceasta este o variabilă globală în care
// va fi memorat un mesaj
// ar trebui să vadă utilizatorul
$ MSG = '';

// fișier jurnal
defini ('LOGFILE'. '/home/mysite/mylog.log');

// diferența de timp cu serverul (în secunde)
define ('TIMEOFFSET' 0);

funcția my_error_handler ($ code. $ msg. $ file. $ line)
<
// variabila globala, care va fi
// scrieți un mesaj de eroare.
global $ MSG;

// săriți erorile de nivel E_NOTICE
// și ignorați erorile dacă modul de mesaje de eroare este dezactivat
dacă (($ code == E_NOTICE) sau (error_reporting () == 0)) <
return;
>

// dacă am cauzat nivelul de eroare E_USER_NOTICE - doar
// scrieți textul de eroare din variabila globală $ MSG
// și opriți funcția

dacă ($ code == E_USER_NOTICE) <
$ MSG = $ msg;
Întoarcere;
>

// dacă eroarea de nivel este E_ERROR - tipăriți textul de eroare
// și termină execuția scriptului

dacă ($ code == E_ERROR) <
die ('
EROARE: “. $ msg. '
În '. fișier $. '(linie'. $ linie ')
„);
>

// dacă eroarea de nivel este E_WARNING - tipăriți textul de eroare
// și opriți executarea funcției

dacă ($ code == E_WARNING) <
echo "
ATENȚIE: “. $ msg. '
În '. fișier $. '(linie'. $ linie ')
„;
Întoarcere;
>

// dacă eroarea de nivel este E_USER_ERROR

dacă ($ code == E_USER_ERROR)

$ MSG = 'Eroare critică: Operația nu a fost efectuată.

Un mesaj de eroare a fost trimis dezvoltatorului. ;

// detaliile sunt scrise în text $

$ text = $ msg. '
“. „Fișier“. fișier $. '('. $ linie ')';

// Dacă constanta DEBUG este setată la 1 - tipăriți informații despre
// eroare pe ecran, dacă nu - trimiteți textul de eroare prin poștă
// funcția error_mail () și scrie în log - funcția error_writelog ()

dacă (DEBUG == 1) <
error_print ($ text);
> altceva <
error_mail (text $);
error_writelog ($ text);
>


// instalați dispozitivul de manipulare
set_error_handler ('my_error_handler');

Acum, descriem funcțiile de serviciu


// fișierul imprimă o eroare pe ecran
funcție error_print ($ text)
<
echo $ text. '

„;
>

// f-i trimite eroarea prin e-mail
funcția error_mail (text $)
<
$ text = str_replace ("
"." n ". $ text);

$ info = 'Timp:'. get_datetime (). "nRemote IP:". get_ip (). "N";

mail (ADM_EMAIL. "Eroare de raportare". $ info. $ text);
>

/ / Am scris o eroare în jurnal
funcția error_writelog (text $)
<
$ text = str_replace ("
"." t ". $ text);
dacă (@ $ fh = fopen (LOGFILE. "a +")) <
fputs ($ fh; get_datetime (). "t". get_ip () "t". $ text. "n");
fclose ($ fh);
>
>


// obțineți timpul, luând în considerare diferența de timp
funcția get_time ()
<
întoarcere (data ("H: i" .time () + TIMEOFFSET));
>

// obțineți data, luând în considerare diferența de timp
funcția get_date ()
<
retur (data ("Y-m-d" .time () + TIMEOFFSET));
>

// obțineți data și ora, luând în considerare diferența de timp
funcția get_datetime ()
<
returnați get_date (). ''. get_time ();
>

// obține IP
funcția get_ip ()
<
retur ($ _SERVER ['REMOTE_ADDR']);
>
Și în sfârșit un exemplu de utilizare

// f-i scrie știrile într-un fișier
funcție write_news ($ title. $ text)
<
$ news_file = '/home/mysite/news.txt';

// verificați prezența antetului - eroarea nu este critică
dacă (! trim ($ title))

// pentru a determina dacă funcția a fost finalizată
// eșec - este necesar să se întoarcă false. funcție
// trigger_error () - returnează adevărat, vom
// returnați rezultatul inversat

întoarce. trigger_error ('Trebuie să specificați un antet de știri');
>

// verifica prezența de știri text - eroarea nu este critică
dacă (! trim ($ text)) <
întoarce. trigger_error ("Trebuie să specificați textul știrilor");
>

// verificați prezența fișierului în care vom scrie
// dacă fișierul nu este găsit - apare o eroare critică

dacă (! file_exists ($ news_file)) <
întoarce. trigger_error ('Fișierul bazei de date de știri nu a fost găsit!'. E_USER_ERROR);
>

//. aici prelucrarea preliminară a datelor.

/ / scrieți știrile
$ fh = fopen ($ news_file. "a +");
fputs ($ fh. $ titlu. "t". $ text "n");
fclose ($ fh);

// dacă totul este OK - funcția returnează true
return true;
>

// încearcă să scrie știrile
// aceste date pot proveni din formularul web

$ res = write_news ("Știrile mele" "Textul știrilor mele");

// dacă este falsă, imprimați eroarea
echo $ MSG;

// dacă totul este în ordine - puteți să-l raportați
// dar este mai bine să forțezi utilizatorul undeva.
echo "Vestea a fost adăugată";
>

Acesta este un exemplu destul de simplu, tema poate fi dezvoltată.

Articole similare