PHP Fejlhåndtering

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.