Zarządzanie Błędami w PHP

W PHP domyślna obsługa błędów jest prosta. Wiadomość zostanie wysłana do przeglądarki, która zawiera nazwę pliku, numer wiersza oraz opis błędu.

Zarządzanie Błędami w PHP

W tworzeniu skryptów i aplikacji webowych, obsługa błędów jest istotnym elementem. Jeśli brakuje w kodzie kodu wykrywania błędów, program wygląda nieprofesjonalnie i otwiera drzwi do ryzyka bezpieczeństwa.

Ta instrukcja wprowadza niektóre z najważniejszych metod wykrywania błędów w PHP.

Omówimy różne metody obsługi błędów:

  • Proste polecenie "die()"
  • Niestandardowe błędy i wyzwalacze błędów
  • Raportowanie błędów

Podstawowa obsługa błędów: użycie funkcji die()

Pierwszy przykład pokazuje prosty skrypt otwierający plik tekstowy:

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

Jeśli plik nie istnieje, otrzymasz komunikat błędu podobny do tego:

Ostrzeżenie: fopen(welcome.txt) [function.fopen]: nie udało się otworzyć strumienia: 
Nie ma takiego pliku lub katalogu w C:\webfolder\test.php w wierszu 2

Aby uniknąć uzyskania komunikatu błędu podobnego do powyższego, sprawdzamy, czy plik istnieje przed jego dostępem:

<?php
if(!file_exists("welcome.txt"))
 {
 die("Plik nie znaleziony");
 }
else
 {
 $file=fopen("welcome.txt","r");
 }
?>

Teraz, gdy plik nie istnieje, otrzymasz komunikat błędu podobny do tego:

Plik nie znaleziony

W porównaniu do poprzedniego kodu, powyższy kod jest bardziej efektywny, ponieważ wprowadza prosty mechanizm obsługi błędów, który kończy skrypt po błędzie.

Jednak po prostu kończenie skryptu nie zawsze jest odpowiednim rozwiązaniem. Zbadajmy alternatywne funkcje PHP do obsługi błędów.

Tworzenie niestandardowego procesora błędów

Tworzenie niestandardowego procesora błędów jest bardzo proste. Stworzyliśmy po prostu specjalną funkcję, którą można wywołać, gdy wystąpi błąd w PHP.

Funkcja ta musi być zdolna do obsługi co najmniej dwóch parametrów (poziom błędu i komunikat błędu), ale może przyjąć do pięciu parametrów (opcjonalnie: plik, numer wiersza oraz kontekst błędu):

Gramatyka

error_function(error_level, error_message,
error_file, error_line, error_context)
Parametr Opis
error_level

Wymagane. Definicja błędów użytkownika określa poziom raportowania błędów. Musi być wartością liczbową.

Zobacz poniższą tabelę: poziom raportowania błędów.

error_message Wymagane. Definicja błędów użytkownika określa komunikat błędu.
error_file Opcjonalnie. Określa nazwę pliku, w którym wystąpił błąd.
error_line Opcjonalnie. Określa numer wiersza, w którym wystąpił błąd.
error_context Opcjonalnie. Określa tablicę, która zawiera wszystkie zmienne używane w momencie wystąpienia błędu oraz ich wartości.

Poziom Raportowania Błędów

Te poziomy raportowania błędów to różne typy błędów, które programista obsługi błędów ma na celu przetwarzanie:

Wartość Stała Opis
2 E_WARNING Nieważne błędy w czasie działania. Nie zatrzymują wykonywania skryptu.
8 E_NOTICE

Powiadomienia w czasie działania.

Skrypt wykrywa możliwość wystąpienia błędu, ale może to również się zdarzyć podczas normalnego działania skryptu.

256 E_USER_ERROR Krytyczne błędy generowane przez użytkownika. Podobne do E_ERROR ustawionego przez programistę za pomocą funkcji PHP trigger_error().
512 E_USER_WARNING Nieważne ostrzeżenia generowane przez użytkownika. Podobne do E_WARNING ustawionego przez programistę za pomocą funkcji PHP trigger_error().
1024 E_USER_NOTICE Powiadomienia generowane przez użytkownika. Podobne do E_NOTICE ustawionego przez programistę za pomocą funkcji PHP trigger_error().
4096 E_RECOVERABLE_ERROR Krytyczne błędy, które można uchwycić. Podobne do E_ERROR, ale mogą być uchwycane przez niestandardowego programistę obsługi błędów. (Zobacz set_error_handler())
8191 E_ALL

Wszystkie błędy i ostrzeżenia, z wyjątkiem poziomu E_STRICT.

(W PHP 6.0, E_STRICT jest częścią E_ALL)

Teraz, pozwólmy sobie stworzyć funkcję do obsługi błędów:

function customError($errno, $errstr)
 { 
 echo "<b>Błąd:</b> [$errno] $errstr<br />";
 echo "Koniec skryptu";
 die();
 }

Powyższy kod to prosta funkcja obsługi błędów. Gdy jest uruchamiana, pobiera poziom błędu i komunikat błędu. Następnie wyświetla poziom błędu i komunikat, a następnie zatrzymuje skrypt.

Teraz, gdy już stworzyliśmy funkcję obsługi błędów, musimy określić, kiedy ma być uruchomiona.

Ustawienie Programisty Obsługi Błędów

Domyślnym programistą obsługi błędów w PHP jest wbudowany programista obsługi błędów. Planujemy przekształcić powyższą funkcję w domyślnego programistę obsługi błędów w trakcie działania skryptu.

Można modyfikować programistę obsługi błędów, aby stosował się tylko do pewnych błędów, tak że skrypt może obsługiwać różne błędy w różny sposób. Jednak w tym przykładzie, planujemy używać naszej niestandardowej funkcji obsługi błędów dla wszystkich błędów:

set_error_handler("customError");

Ponieważ chcemy, aby nasza niestandardowa funkcja obsługiwała wszystkie błędy, set_error_handler() wymaga tylko jednego parametru, ale można dodać drugi parametr, aby określić poziom błędu.

Przykład

Przetestuj ten program obsługi błędów, próbując wyjść poza istniejące zmienne:

<?php
//funkcja handlera błędów
function customError($errno, $errstr)
 { 
 echo "<b>Błąd:</b> [$errno] $errstr";
 }
//ustaw handler błędów
set_error_handler("customError");
//trigger error
echo($test);
?>

Wyjście z powyższego kodu powinno wyglądać podobnie:

Błąd: [8] Niezdefiniowana zmienna: test

Wywoływanie błędów

W miejscu wprowadzania danych użytkownika w skrypcie, gdy dane użytkownika są niewłaściwe, wywoływanie błędów jest bardzo użyteczne. W PHP ta funkcja jest realizowana przez trigger_error().

Przykład

W tym przykładzie, jeśli zmienna "test" jest większa niż "1", wystąpi błąd:

<?php
$test=2;
if ($test>1)
{
trigger_error("Wartość musi być 1 lub poniżej");
}
?>

Wyjście z powyższego kodu powinno wyglądać podobnie:

Uwaga: Wartość musi być 1 lub poniżej
w C:\webfolder\test.php w wierszu 6

Możesz wywołać błąd w dowolnym miejscu w skrypcie, Dzięki drugiemu parametrowi możesz określić poziom wywoływanej błędu.

Możliwe typy błędów:

  • E_USER_ERROR - śmiertelny błąd run-time generowany przez użytkownika. Błąd nie może być naprawiony. Wykonanie skryptu jest przerwane.
  • E_USER_WARNING - nieznaczący alarm run-time generowany przez użytkownika. Wykonanie skryptu nie jest przerwane.
  • E_USER_NOTICE - domyślnie. Powiadomienia run-time generowane przez użytkownika. Skrypt znalazł możliwe błędy, ale może również wystąpić, gdy skrypt działa poprawnie.

Przykład

W tym przykładzie, jeśli zmienna "test" jest większa niż "1", występuje błąd E_USER_WARNING. Jeśli wystąpi błąd E_USER_WARNING, użyjemy naszego własnego programu obsługi błędów i zakończymy skrypt:

<?php
//funkcja handlera błędów
function customError($errno, $errstr)
 { 
 echo "<b>Błąd:</b> [$errno] $errstr<br />";
 echo "Koniec skryptu";
 die();
 }
//ustaw handler błędów
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Wartość musi być 1 lub poniżej",E_USER_WARNING);
 }
?>

Wyjście z powyższego kodu powinno wyglądać podobnie:

Błąd: [512] Wartość musi być 1 lub poniżej
Koniec skryptu

Teraz nauczyliśmy się, jak tworzyć swoje własne błędy oraz jak je wywoływać, teraz przeanalizujmy logowanie błędów.

Logowanie błędów

Domyślnie, zgodnie z konfiguracją error_log w pliku php.ini, PHP wysyła logi błędów do systemu rejestrowania błędów serwera lub do pliku. Dzięki użyciu funkcji error_log() możesz wysyłać logi błędów do określonego pliku lub odległego miejsca.

Wysyłanie błędnych wiadomości do siebie za pomocą e-maila to dobry sposób na uzyskanie informacji o określonych błędach.

Wysyłanie błędnych wiadomości za pomocą E-Mail

W poniższym przykładzie, jeśli wystąpi określony błąd, wyślemy e-mail z komunikatem o błędzie i zakończymy skrypt:

<?php
//funkcja handlera błędów
function customError($errno, $errstr)
 { 
 echo "<b>Błąd:</b> [$errno] $errstr<br />";
 echo "Webmaster został powiadomiony";
 error_log("Błąd: [$errno] $errstr",1,
 "someone@example.com","From: webmaster@example.com");
}
//ustaw handler błędów
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Wartość musi być 1 lub poniżej",E_USER_WARNING);
 }
?>

Wyjście z powyższego kodu powinno wyglądać podobnie:

Błąd: [512] Wartość musi być 1 lub poniżej
Webmaster został powiadomiony

E-maile odbierane z powyższego kodu wyglądają podobnie:

Błąd: [512] Wartość musi być 1 lub poniżej

Ta metoda nie jest odpowiednia dla wszystkich błędów. Zwykłe błędy powinny być zapisywane na serwerze za pomocą domyślnego systemu rejestrowania błędów PHP.