PHP felhantering
- Föregående sida PHP Säker E-post
- Nästa sida PHP Exception
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.
- Föregående sida PHP Säker E-post
- Nästa sida PHP Exception