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.