Zarządzanie Błędami w PHP
- Poprzednia strona Bezpieczny e-mail PHP
- Następna strona Wyjątki 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.
- Poprzednia strona Bezpieczny e-mail PHP
- Następna strona Wyjątki PHP