PHP felhantering

I PHP, den defaulta felhanteringen är mycket enkel. Ett meddelande skickas till webbläsaren, meddelandet innehåller filnamn, radnummer och en beskrivning av felet.

PHP felhantering

När du skapar skript och webbapplikationer är felhantering en viktig del. Om ditt kod saknar felkontrollkoder ser programmet mycket oprofessionellt ut och öppnar också upp för säkerhetsrisker.

Denna guide introducerar några av de mest viktiga felkontrollmetoderna i PHP.

Vi kommer att förklara olika felhanteringsmetoder för dig:

  • En enkel "die()"-sats
  • Anpassade fel och felutlösare
  • Felsrapportering

Grundläggande felhantering: Använda die() funktionen

Den första exempelvis visar ett enkelt skript för att öppna en textfil:

<?php
$file=fopen("welcome.txt","r");
?>

Om filen inte finns, kommer du att få ett fel som liknar detta:

Varning: fopen(welcome.txt) [function.fopen]: kunde inte öppna ström: 
Ingen sådan fil eller katalog i C:\webfolder\test.php på rad 2

För att undvika att användaren får ett felmeddelande som ovan, kontrollerar vi om filen finns innan vi åtkommer filen:

<?php
if(!file_exists("welcome.txt"))
 {
 die("Fil inte funnen");
 }
annars
 {
 $file=fopen("welcome.txt","r");
 }
?>

Nu, om filen inte finns, kommer du att få ett felmeddelande liknande detta:

Fil inte funnen

Koden ovan är mer effektiv än den tidigare, eftersom den använder ett enkelt felhanteringsmekanism för att avsluta skriptet efter fel.

Men att enkelt avsluta skriptet är inte alltid det mest lämpliga sättet. Låt oss undersöka alternativ PHP-funktioner för att hantera fel.

Skapa en anpassad felhanterare

Att skapa en anpassad felhanterare är mycket enkelt. Vi skapar enkelt en dedikerad funktion som kan anropas när ett fel inträffar i PHP.

Funktionen måste kunna hantera minst två parametrar (felsnivå och felmeddelande), men kan acceptera högst fem parametrar (valfria: fil, radnummer samt felkontext):

Syntax

error_function(error_level, error_message,
error_file, error_line, error_context)
Parameter 描述
error_level

Obligatorisk. Felsrapportsnivå definieras av användaren. Det måste vara ett värde.

Se tabellen nedan: Felsrapportsnivå.

error_message Obligatorisk. Felsknappselsmeddelanden definieras av användaren.
error_file 可选。规定错误在其中发生的文件名。
error_line 可选。规定错误发生的行号。
error_context 可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。

错误报告级别

这些错误报告级别是错误处理程序旨在处理的错误的不同的类型:

常量 描述
2 E_WARNING 非致命的 run-time 错误。不会暂停脚本执行。
8 E_NOTICE

Run-time 通知。

脚本发现可能发生错误,但也可能在脚本正常运行时发生。

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

Alla fel och varningar, utom nivå E_STRICT.

(I PHP 6.0 är E_STRICT en del av E_ALL)

Låt oss nu skapa en funktion för att hantera fel:

function customError($errno, $errstr)
 { 
 echo "<b>Fel:</b> [$errno] $errstr<br />";
 echo "Avsluta Skript";
 die();
 }

Ovanstående kod är en enkel felhanteringsfunktion. När den aktiveras, hämtar den felnivå och felmeddelande. Därefter skriver ut felnivå och meddelande och avslutar skriptet.

Nu har vi skapat en felhanteringsfunktion och behöver bestämma när den ska aktiveras.

Set Error Handler

PHP:s standardfelhanterare är den inbyggda felhanteraren. Vi vill göra om den ovanstående funktionen till den standardfelhanterare som körs under skriptets körning.

Du kan modifiera felhanteraren så att den bara tillämpas på vissa fel, så att skriptet kan hantera olika fel på olika sätt. Men i detta exempel vill vi använda vår anpassade felhanterare för alla fel:

set_error_handler("customError");

Eftersom vi vill att våra anpassade funktioner hanterar alla fel, behöver set_error_handler() endast en parameter, men du kan lägga till en andra parameter för att specificera felnivå.

Exempel

Testa denna felhanterare genom att försöka skriva ut en icke-existerande variabel:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr";
 }
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>

Utmatningen från ovanstående kod bör se ut så här:

Error: [8] Undefined variable: test

Trigga fel

Det är mycket användbart att trigga fel vid plats där användaren anger data i skriptet, när användarens inmatning är ogiltig. I PHP utför denna uppgift trigger_error().

Exempel

I detta exempel inträffar ett fel om "test"-variabeln är större än "1":

<?php
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below");
}
?>

Utmatningen från ovanstående kod bör se ut så här:

Notice: Value must be 1 or below
i C:\webfolder\test.php on line 6

Du kan trigga fel på vilket ställe som helst i skriptet genom att lägga till en andra parameter kan du specificera den triggar felnivån.

Möjliga feltyper:

  • E_USER_ERROR - Dödlig användargenererad run-time-fel. Felet kan inte åtgärdas. Skriptets körning avbryts.
  • E_USER_WARNING - Ej dödlig användargenererad run-time-varning. Skriptets körning avbryts inte.
  • E_USER_NOTICE - Standard. Användargenererade run-time-meddelanden. Skriptet har upptäckt möjliga fel, men kan också inträffa när skriptet körs normalt.

Exempel

I detta exempel inträffar E_USER_WARNING-fel om "test"-variabeln är större än "1". Om E_USER_WARNING inträffar kommer vi att använda vår egen anpassade felhanterare och avsluta skriptet:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Fel:</b> [$errno] $errstr<br />";
 echo "Avsluta Skript";
 die();
 }
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Värdet måste vara 1 eller lägre",E_USER_WARNING);
 }
?>

Utmatningen från ovanstående kod bör se ut så här:

Fel: [512] Värdet måste vara 1 eller lägre
Avsluta Skript

Nu har vi lärt oss hur vi skapar egna fel och hur vi triggar dem, nu undersöker vi felloggning.

Felloggning

Som standard skickar PHP felloggar till serverns felloggsystem eller en fil baserat på konfigurationen i php.ini. Genom att använda error_log() -funktionen kan du skicka felloggar till specifika filer eller fjärrmål.

Att skicka felmeddelanden till dig själv via e-post är ett bra sätt att få information om specifika fel.

Skicka felmeddelanden via E-Mail

I följande exempel kommer vi att skicka ett e-postmeddelande med felmeddelandet och avsluta skriptet om en specifik fel uppstår:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Fel:</b> [$errno] $errstr<br />";
 echo "Webmaster har blivit meddelad";
 error_log("Fel: [$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ärdet måste vara 1 eller lägre",E_USER_WARNING);
 }
?>

Utmatningen från ovanstående kod bör se ut så här:

Fel: [512] Värdet måste vara 1 eller lägre
Webmaster har blivit meddelad

E-post mottagen från ovanstående kod liknar detta:

Fel: [512] Värdet måste vara 1 eller lägre

Denna metod är inte lämplig för alla fel. Vanliga fel bör registreras på servern genom att använda den standardiserade PHP-loggsystemet.