Hiba kezelése php

Hibakezelés PHP.

Hiba kezelésének trigger_error () és set_error_handler ()


A PHP egy kiváló lehetőség, hogy kísérje figyelemmel a hibákat. Itt fogunk beszélni, hogyan kell kezelni a hibát - jelentést (vagy a jelentés) az esetről, hogy a felhasználó, ha szükséges -, hogy tájékoztassa a rendszergazda e-mailben, írja le az információt az eseményről a log-fájlt.

Tehát először is, nézzük meg, mi a hiba a PHP.

A PHP támogatja a következő hiba szintek:

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

Valójában - ez csak egy konstans, hogy használják, hogy meghatározzák a szint hibakezelés, az építkezés egy bit-maszk. Állandókat „beszélő” neveket. Nézzük az állandó - azt mondhatjuk, hogy E_PARSE szintű hiba történik abban az esetben, szintaktikai hiba, E_NOTICE - ez egy emlékeztető, hogy a programozó kb megsértését „jó stílusban” programozás PHP.

Ha a vegyületet bázissal MySQL adatbázis (vagy más) nem - értelmező PHP tájékoztatja E_WARNING szintű

Figyelmeztetés. mysql_connect (): A hozzáférés megtagadva felhasználó. 'VVingless @ localhost' (using jelszó. YES)
A / home / mysite / index. php (line 83)

Megjegyzés: Ahhoz, hogy a PHP-értelmező hibát - PHP kell konfigurálni: display_errors flag be kell vonni - 1. error_reporting direktíva jeleznie kell, hogy szükség van, hogy megjelenjen E_WARNING szintű (természetesen kívánatos és mások). Ha az értékek ezen irányelvek nem felel meg az igényeinek - akkor próbálja telepíteni magát, hozott egy mappát a script fájlt .htaccess (dot elején a név szükséges) erről a tartalom:


php_flag display_errors on
php_value error_reporting „E_ALL

Ez azt jelenti, hogy hibaüzenet jelenik meg, és minden szinten, kivéve E_NOTICE
Amikor a programozó lehetővé szintaktikai hiba - PHP értelmező hibát jelez szinten E_PARSE


Feldolgozási hiba: értelmezési hiba, nem várt '(', arra számítva, T_STRING a /home/mysite/index.php on line 150

De a legérdekesebb számunkra, hibaarány - E_USER_ERROR és E_USER_WARNING. Mivel ez a címéből - ez a hiba szintjét, hogy lehet telepíteni a felhasználó. Erre a célra trigger_error () függvény - segítségével, akkor értesíti a felhasználót a baleset, mint ez teszi a PHP.

Mint tudjuk, a PHP kézikönyv - trigger_error () függvény két paramétert.

void trigger_error (string ERROR_MSG [, int ERROR_TYPE])

Az első lehetőség - a szöveg a hibaüzenet, mint például „A fájl nem található”. A második lehetőség - szintjét határozza meg a hibákat. trigger_error () függvény csak akkor működik, hiba E_USER család - ez azt jelenti, hogy lehet telepíteni E_USER_ERROR szintű hiba, E_USER_WARNING, E_USER_NOTICE és nem tudja megállapítani a szintet E_WARNING. A második paraméter elhagyható és az alapértelmezett E_USER_NOTICE.

Tegyük fel, mi adatok hírcsatornák vannak tárolva news.txt fájlt, ha a fájl nem található - meg kell bejelenteni a hibát. program szövege fog kinézni:

if (file_exists ( '/ home / mysite / news.txt')!) trigger_error (News fájl nem található ");
>

Ennek eredményeként, a PHP értelmező hibát jelez szinten E_USER_NOTICE

Figyelmeztetés: News fájl nem található /home/mysite/index.php on line 47
De mit ad nekünk ez? Kezdjük azzal, hogy ha a php.ini vagy .htaccess fájlt telepített irányelv

php_value log_errors "1"
php_value log_errors_max_len "1024"
php_value error_log "/home/mysite/my.log"
/home/mysite/my.log a fájl automatikusan hozzáadódik a rekord az esemény.

Mint ismeretes a kézi - PHP 4-függvény egy karakterlánc paraméter - a függvény nevét kell végrehajtani, ha hiba történik. PHP 5 növeli a képességet, hogy hozzanak még egy paraméter - a hiba jellege, hogy fogja feldolgozni a felvezető. A függvény egy karakterlánc - a kezelő nevét, hogy már létre ezt a pontot.

karakterlánc set_error_handler (visszahívás error_handler [, int error_types])

set_error_handler ( "my_error_handler");
A felhasználó által definiált függvény, amely kezeli a hiba, lehet hogy a következő bemeneti paraméterek:

- error-szintű kód
- karakterlánc értelmezése hibák
- • a fájl neve, ahol a hiba történt
- sort, ahol a hiba történt

Azt is meg kell jegyezni, hogy ez a funkció nem tudja kezelni a hibákat E_ERROR szinten, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING

Ez annak a ténynek köszönhető, hogy a felsorolt ​​hibák szintje előtt bekövetkezett értelmező információt kap a felhasználó hibakezelő.

Ezért kinyilvánítjuk funkció

függvény my_error_handler ($ kódot, $ msg, $ file, $ line)>

Megjegyzés: Minden többé-kevésbé veszik körül a szkript általában osztva több fájlt a kényelem vele dolgozni. Hogyan szervezzünk egy moduláris program - beszédtéma egyedül. Most már csak azt szeretném, hogy tanácsot kiosztani általános beállításokat egy külön fájlban, amely csatlakozik az elején a program segítségével a használati közé, akár auto_prepend_file irányelvet. Ez a fájl lehet helyezni, és a felvezető. Szerelési hibakezelő kell megvalósítani a lehető legközelebb a program elején, kívánatos az első helyen.
Annak érdekében, hogy megbizonyosodjon arról, hogy tényleg működik - hozzon létre egy új PHP fájlt, és megpróbálja futtatni

Fájl tartalma myerrortest.php

függvény my_error_handler ($ kódot. $ msg. $ file. $ line)

echo „Hiba történt $ msg ($ code)
n „;
echo "$ file ($ line)";
>

if (! file_exists (/home/mysite/news.txt ')) <
trigger_error (News fájl nem található ");
>


A feldolgozás eredményeképpen a fájl:

Hiba történt a News fájl nem található (1024)
/home/mysite/myerrortest.php (12)
Most van egy funkció, amely adatokat kap az összes előforduló hibákat. Úgy véljük, hogy hogyan tudjuk használni.

Mi lesz feldolgozni a hiba szintjét
E_ERROR
E_WARNING
E_NOTICE
E_USER_ERROR
E_USER_NOTICE

Az első három hibákat egy jó elkészült program nem történhet meg egyáltalán, így számukra csak akkor tudunk értesíteni a felhasználói terminál a hiba szöveget a képernyőn. Így a munka, amíg a script képes fejleszteni, majd jelentsék azokat, akkor sem kikapcsolni, vagy írjon egy log-fájl.

Most a funkció a hibakezelés fog kinézni:

// Kis készletek

// állítsa a hiba megjelenítési mód
// megjeleníti kívül minden hiba E_NOTICE
error_reporting (E_ALL

// ez az állandó töltés
// engedélyezése / tiltása debug módban
// során hibakeresés - az üzeneteket nem küldött
// az e-mail, és egyszerűen nyomtatva a képernyőn
define ( 'DEBUG' 0.);

// ez egy globális változó,
// tárolja az üzenetet
// felhasználó látni kell
$ MSG = '';

Fájl // log
define ( 'LOGFILE' '/home/mysite/mylog.log'.);

// az időeltolódás a szerver (másodpercben)
define ( 'TIMEOFFSET' 0.);

függvény my_error_handler ($ kódot. $ msg. $ file. $ line)
<
// globális változó, ami lesz
// egy hiba üzenetet.
global $ MSG;

// hagyja E_NOTICE szintű hibákat
// és figyelmen kívül hagyja a hibát, ha a hibaüzenet van tiltva
if (($ kód == E_NOTICE) vagy (error_reporting () == 0)) <
return;
>

// ha az okozta a hibát E_USER_NOTICE szinten - csak
// írni a szöveget egy hiba a globális változó $ MSG
// és stop funkció

if ($ kód == E_USER_NOTICE) <
$ MSG = $ msg;
return;
>

// ha a hibák szintje E_ERROR - print hibaszöveggel
// és teljes futása

if ($ kód == E_ERROR) <
die ( '
ERROR: ”. $ Msg. '
A”. $ Fájl. '(Vonal'. $ Sor.)
„);
>

// ha a hiba szintjét E_WARNING - print hibaszöveggel
// és hagyja abba a végrehajtását

if ($ kód == E_WARNING) <
echo '
FIGYELEM: ”. $ Msg. '
A”. $ Fájl. '(Vonal'. $ Sor.)

return;
>

// ha a hibák szintje E_USER_ERROR

if ($ kód == E_USER_ERROR)

$ MSG = „Kritikus hiba: Action Megvalósult adósságait.

hibaüzenetet küldött a fejlesztő. " ;

// írja a részleteket a változó $ text

$ Text = $ msg. '
”. „Fájl”. $ Fájl. '('. $ Sor. ');

// Ha a DEBUG állandó értéke 1 - print információk
// hiba a képernyőn - ha nem, küldjön szöveges mail hiba
// függvény error_mail (), és írd meg a naplóban - funkció error_writelog ()

ha (DEBUG == 1) <
error_print ($ text);
> más <
error_mail ($ text);
error_writelog ($ text);
>


// állítsa a felvezető
set_error_handler ( 'my_error_handler');

Most leírjuk a szolgáltatási funkciók


// ip-én nyomtatni egy hiba, hogy a képernyőn
függvény error_print ($ text)
<
echo $ text. '


>

// ip-i egy hibaüzenetet küld mail
függvény error_mail ($ text)
<
$ Text = str_replace ( "
"" N „$ text) .;

$ Info = 'idő'. get_datetime (). "NTávoli IP:". get_ip (). "N";

mail (.. ADM_EMAIL "Hibajelentés" $ info $ text.);
>

// ip-írom hiba a naplóban
függvény error_writelog ($ text)
<
$ Text = str_replace ( "
"" T „$ text) .;
if (@ $ fh = fopen (LOGFILE. "a +")) <
fputs (... $ fh get_datetime () "t" get_ip () "t" $ text "n" ...);
fclose ($ fh);
>
>


// kap az idő, figyelembe véve az időeltolódás
funkció get_time ()
<
visszatérési (dátum ( "H: i" idő () + TIMEOFFSET).);
>

// kap a dátumot, figyelembe véve az időeltolódás
funkció get_date ()
<
visszatérési (dátum ( "Y-m-d" idő () + TIMEOFFSET).);
>

// kap a dátumot és az időt, figyelembe véve az időeltolódás
funkció get_datetime ()
<
vissza get_date (). ''. get_time ();
>

// kap IP
funkció get_ip ()
<
vissza ($ _SERVER [ 'REMOTE_ADDR']);
>
Végül egy példa használat

// ip-i ír hírek fájl
függvény write_news ($ title. $ text)
<
$ News_file = '/home/mysite/news.txt';

// ellenőrizze a rendelkezésre álló egy címet - a hiba nem kritikus
if (! trim ($ title))

// annak meghatározására, hogy a függvény véget ért
// hiba - meg kell return false. függvény
// trigger_error () - igaz értékkel tér vissza, akkor
// visszatér az eredménye annak fordított

visszatéréshez. trigger_error (Meg kell adni a címlapokon ');
>

// ellenőrizze a rendelkezésre álló szöveg hírek - a hiba nem kritikus
if (! trim ($ text)) <
visszatéréshez. trigger_error ( „Meg kell adnia a szöveg a hírek”);
>

// ellenőrizzük, hogy a fájl, amelybe írunk
// ha a fájl nem található - kritikus hiba

if (! file_exists ($ news_file)) <
visszatéréshez. trigger_error (híradatbázis fájl nem található! 'E_USER_ERROR.);
>

//. akkor az adatok előfeldolgozás.

// írom a híreket
$ Fh = fopen ($ news_file "a +".);
fputs ($ fh $ címe "T" $ text "n" ....);
fclose ($ fh);

// ha minden jól megy - akkor a függvény true
return true;
>

// megpróbálja írni a hírt
// ez az adat érkezhet webes formában

$ Res = write_news ( "My News" "Text híreimet.");

// ha vissza false - hibaüzenetek
echo $ MSG;

// ha minden rendben - akkor jelentheti
// a jobb felhasználói otforvardit valahol.
echo 'News adunk;
>

Ez egy meglehetősen egyszerű példát, a téma lehet fejleszteni.

Kapcsolódó cikkek