PHP Fejlhåndtering
- Forrige side PHP sikker e-mail
- Næste side PHP undtagelse
I PHP er standard fejlhåndtering meget simpel. En besked sendes til browseren, og denne besked indeholder filnavn, linjenummer og en beskrivelse af fejlen.
PHP Fejlhåndtering
Når du opretter scripts og webapplikationer, er fejlhåndtering en vigtig del. Hvis din kode mangler fejlfindingskoding, ser programmet ikke professionelt ud og åbner også for sikkerhedsrisici.
Denne vejledning introducerer nogle af de vigtigste fejlfindingsmetoder i PHP.
Vi vil forklare forskellige fejlhåndteringsmetoder for dig:
- En simpel "die()" sætning
- Brugerdefinerede fejl og fejludløsere
- Fejlrapportering
Grundlæggende fejlhåndtering: Brug af die() funktion
Den første eksempel viser et simpelt skript til at åbne en tekstfil:
<?php $file=fopen("welcome.txt","r"); ?>
Hvis filen ikke findes, får du en fejl som denne:
Advarsel: fopen(welcome.txt) [funktion.fopen]: fejlede at åbne strøm: Ingen sådan fil eller mappe i C:\webfolder\test.php på linje 2
For at undgå, at brugeren får en fejlmeddelelse som ovenfor, kontrollerer vi, om filen findes, før vi tilgår filen:
<?php if(!file_exists("welcome.txt")) { die("Fil ikke fundet"); } else { $file=fopen("welcome.txt","r"); } ?>
Lad os antage, at filen ikke findes, så får du en fejlmeddelelse som denne:
Fil ikke fundet
Kode ovenfor er mere effektiv end den tidligere kode, fordi den bruger en simpel fejlhåndteringsmekanisme til at afslutte skriptet efter en fejl.
Men at afslutte skriptet simpelthen er ikke altid den rigtige måde. Lad os undersøge de alternative PHP-funktioner til fejlhåndtering.
Opret brugerdefineret fejlhåndterer
Det er meget simpelt at oprette en brugerdefineret fejlhåndterer. Vi oprettede simpelt hen en dedikeret funktion, der kan kaldes, når der opstår en fejl i PHP.
Denne funktion skal være i stand til at håndtere mindst to parametre (fejliveau og fejlmeddelelse), men kan acceptere op til fem parametre (valgfri: fil, linjenummer samt fejlkontekst):
Syntaks
error_function(error_level, error_message, error_file, error_line, error_context)
Parameter | 描述 |
---|---|
error_level | Nødvendigt. Definerede fejlrapportniveau for brugerdefinerede fejl. Det skal være en værdi. Se nedenstående tabel: Fejlrapportniveau. |
error_message | Nødvendigt. Definerede fejlmeddelelser for brugerdefinerede fejl. |
error_file | 可选。规定错误在其中发生的文件名。 |
error_line | 可选。规定错误发生的行号。 |
error_context | 可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。 |
错误报告级别
这些错误报告级别是错误处理程序旨在处理的错误的不同的类型:
值 | 常量 | 描述 |
---|---|---|
2 | E_WARNING | 非致命的运行时错误。不会暂停脚本执行。 |
8 | E_NOTICE | 运行时通知。 脚本发现可能发生错误,但也可能在脚本正常运行时发生。 |
256 | E_USER_ERROR | 致命的用户生成的错误。类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。 |
512 | E_USER_WARNING | 非致命的用户生成的警告。类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。 |
1024 | E_USER_NOTICE | 用户生成的通知。类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。 |
4096 | E_RECOVERABLE_ERROR | K捕获的致命错误。类似于 E_ERROR,但可以被用户定义的处理程序捕获。(参见 set_error_handler()) |
8191 | E_ALL | Alle fejl og advarsler, med undtagelse af E_STRICT-niveau. (I PHP 6.0 er E_STRICT en del af E_ALL) |
Lad os nu oprette en funktion til at håndtere fejl:
function customError($errno, $errstr) { echo "<b>Fejl:</b> [$errno] $errstr<br />"; echo "Afslutning af Script"; die(); }
Koden ovenfor er en simpel fejlhåndteringsfunktion. Når den aktiveres, indhenter den fejliveau og fejlmeddelelse. Derefter udskriver den fejliveau og meddelelse og afslutter skriptet.
Nu hvor vi har oprettet en fejlhåndteringsfunktion, skal vi bestemme, hvornår denne funktion skal aktiveres.
Indstil Fejlhåndteringsprogram
PHP's standardfejlhåndteringsprogram er det indbyggede fejlhåndteringsprogram. Vi planlægger at gøre den ovenstående funktion til standardfejlhåndteringsprogrammet under skriptets kørsel.
Man kan ændre fejlhåndteringsprogrammet, så det kun anvendes på visse fejl, så skriptet kan håndtere forskellige fejl på forskellige måder. Men i dette eksempel planlægger vi at bruge vores brugerdefinerede fejlhåndteringsprogram til alle fejl:
set_error_handler("customError");
Da vi ønsker at vores brugerdefinerede funktioner skal håndtere alle fejl, kræver set_error_handler() kun én parameter, men man kan tilføje en anden parameter for at specificere fejliveau.
Eksempel
Test denne fejlhåndteringsprogram ved at prøve at udskrive en ikke-eksisterende variabel:
<?php //error handler function function customError($errno, $errstr) { echo "<b>Fejl:</b> [$errno] $errstr"; } //set error handler set_error_handler("customError"); //trigger error echo($test); ?>
Udgangen fra ovenstående kode skal ligner dette:
Fejl: [8] Udefineret variabel: test
Udløs fejl
Brugbare steder til at udløse fejl i scriptet, når brugerens input er ugyldigt. I PHP udføres denne opgave af trigger_error().
Eksempel
I dette eksempel vil der opstå en fejl, hvis "test"-variablen er større end "1":
<?php $test=2; if ($test>1) { trigger_error("Værdien skal være 1 eller lavere"); } ?>
Udgangen fra ovenstående kode skal ligner dette:
Bemærk: Værdien skal være 1 eller lavere i C:\webfolder\test.php på linje 6
Du kan udløse en fejl på ethvert sted i skriptet, ved at tilføje en anden parameter kan du specificere den udløste fejliveau.
Mulige fejltyper:
- E_USER_ERROR - Fatalt brugerdefineret runtime-fejl. Fejlen kan ikke korrigeres. Skriptets udførelse bliver afbrudt.
- E_USER_WARNING - Ikke-fatal brugerdefineret runtime-advarsel. Skriptets udførelse bliver ikke afbrudt.
- E_USER_NOTICE - Standard. Brugerdefineret runtime-notifikation. Skriptet fandt muligvis en fejl, men kan også forekomme, når skriptet kører normalt.
Eksempel
I dette eksempel vil der opstå en E_USER_WARNING-fejl, hvis "test"-variablen er større end "1". Hvis der opstår en E_USER_WARNING, vil vi bruge vores tilpassede fejlhåndteringsprogram og afslutte scriptet:
<?php //error handler function function customError($errno, $errstr) { echo "<b>Fejl:</b> [$errno] $errstr<br />"; echo "Afslutning af Script"; die(); } //set error handler set_error_handler("customError",E_USER_WARNING); //trigger error $test=2; if ($test>1) { trigger_error("Værdien skal være 1 eller lavere",E_USER_WARNING); } ?>
Udgangen fra ovenstående kode skal ligner dette:
Fejl: [512] Værdien skal være 1 eller lavere Afslutning af Script
Nu har vi lært, hvordan vi kan oprette vores egne fejl og hvordan vi udløser dem, nu undersøger vi fejllogning.
Fejllogning
Standardmæssigt sender PHP fejlmeddelelser til serverens fejllogningssystem eller fil baseret på konfigurationen i php.ini under error_log. Ved at bruge error_log() funktionen kan du sende fejlmeddelelser til en specificeret fil eller fjern destination.
At sende en fejlmeddelelse til dig selv via e-mail er en god måde at få besked om specificerede fejl.
Send fejlmeddelelser via E-Mail
I nedenstående eksempel vil vi sende en e-mail med fejlmeddelelsen og afslutte skriptet, hvis en bestemt fejl opstår:
<?php //error handler function function customError($errno, $errstr) { echo "<b>Fejl:</b> [$errno] $errstr<br />"; echo "Webmaster har fået besked"; error_log("Fejl: [$errno] $errstr",1, "someone@example.com","From: webmaster@example.com"); } //set error handler set_error_handler("customError",E_USER_WARNING); //trigger error $test=2; if ($test>1) { trigger_error("Værdien skal være 1 eller lavere",E_USER_WARNING); } ?>
Udgangen fra ovenstående kode skal ligner dette:
Fejl: [512] Værdien skal være 1 eller lavere Webmaster er blevet informeret
E-mailer modtaget fra ovenstående kode ligner dette:
Fejl: [512] Værdien skal være 1 eller lavere
Denne metode er ikke egnet til alle fejl. Almindelige fejl skal registreres på serveren ved hjælp af det standard PHP logsystem.
- Forrige side PHP sikker e-mail
- Næste side PHP undtagelse