PHP to najpopularniejszy obecnie język programowania do tworzenia skryptów po stronie serwera. Niestety zdarzają się takie błędy w kodzie, które mogą wywołać zimne dreszcze u tych osób, które nie do końca znają się na programowaniu.
Warto więc dowiedzieć się więcej o błędach PHP, co pozwoli nam w łatwy sposób je zinterpretować i sprawdzić, do jakiej kategorii zaliczyć dany błąd, i czy będziemy mogli naprawić go sami, czy lepiej zlecić to specjaliście.
Z tego tekstu dowiesz się:
- jak dzielimy błędy PHP,
- jak możemy raportować błędy PHP,
- jak stworzyć niestandardowe reguły powiadomień.
Podstawowe typy błędów PHP
Tak naprawdę możemy mówić o dwóch podstawowych rodzajach błędów, które napotkamy podczas pracy z oprogramowaniem tego typu. Rozpoznamy je, nawet jeśli nie jesteśmy programistami i tylko korzystamy z serwera, na przykład w celu zainstalowania na nim bloga. Błędy te dzielą się na:
- Błędy wewnętrzne – są to błędy logiczne w kodzie. Możemy im zapobiec dzięki starannemu programowaniu.
- Błędy zewnętrzne – związane są one z „interakcją ze światem zewnętrznym” i nie są częścią kodu. Wśród nich możemy wymienić: niepowodzenie otwierania pliku lub bazy danych, zerwanie połączenia sieciowego, brak możliwości załadowania określonego modułu PHP i wiele innych. Tego rodzaju błędy zawsze mogą się zdarzyć i często nie będzie to spowodowane naszą winą. Jednocześnie odpowiednie przygotowanie naszego kodu na takie sytuacje pozwoli złagodzić skutki ich wystąpienia.
W jaki sposób radzić sobie z błędami?
W zarządzaniu błędami ważych jest kilka etapów, które pozwalają nam na procesowe podejście do tego typu zdarzeń. Ścieżka działania powinna wyglądać następująco:
- Wyświetlenie błędu – umożliwia zweryfikowanie i „podejrzenie” błędu zarówno programiście, jak i użytkownikowi programu podczas jego użytkowania.
- Stworzenie dziennika błędów – czyli przygotowanie dokumentu, który pozwala na zapisywanie i przeglądanie błędów w formie tekstowego pliku dziennika.
- Działanie – czyli wykonanie czynności, które mają na celu naprawić lub obejść błąd.
Najważniejsze jest jednak to, aby unikać ignorowania błędów. Tego typu postępowanie doprowadzi do konsekwencji, które ostatecznie mogą przerodzić się w małą katastrofę. Dobre podejście do błędów PHP wymusza na nas skupienie się na wyświetlaniu, rejestrowaniu i obsłudze tychże.
Gdzie znajdziemy informacje o błędach?
Zależnie od tego, na jakim etapie chcemy sprawdzić występowanie błędów, będziemy ich inaczej szukać. W innym miejscu, gdy tworzymy kod, a w innym, gdy jest już on wdrożony. Istnieją trzy główne miejsca, gdzie możemy kontrolować błędy. Są to:
- plik php.ini,
- plik .htaccess na naszym serwerze internetowym,
- nasz własny kod PHP.
W tych miejscach mamy cztery możliwości raportowania błędów. Są to:
- error_reporting – ustawia poziom raportowania błędów. Wartość domyślna to “E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED”. Oznacza to, że nie zostaną pokazane błędy z kategorii „E_NOTICE, E_STRICT i E_DEPRECATED”.
- display_errors – automatycznie ustawiony jest parametr „OFF”, jeśli zmienimy go na „ON” błędy będą wyświetlane na ekranie.
- log_errors – wskazuje, czy system ma rejestrować błędy. Domyślnie wartość ta ustawiona jest na „ON”.
- error_log string – wskazuje nazwę pliku, do którego mają być zapisywane błędy.
Poziomy błędów PHP
Obecnie PHP ma piętnaście predefiniowanych stałych błędów, które mają przypisane numery identyfikacyjne. Wszystkie, z rozbudowanym opisem, można znaleźć w tym miejscu. Poniżej skrócona lista.
Rodzaj błędu | Opis |
E_ERROR | Błędy krytyczne pojawiające się w czasie wykonywania |
E_WARNING | Ostrzeżenia w czasie wykonywania (błędy niekrytyczne) |
E_PARSE | Błędy podczas kompilacji |
E_NOTICE | Powiadomienia pojawiające się podczas wykonywania |
E_CORE_ERROR | Błędy krytyczne pojawiające się w czasie uruchamiania (inicjacji) |
E_CORE_WARNING | Błędy niekrytyczne pojawiające się w czasie uruchamiania (inicjacji) |
E_COMPILE_ERROR | Błędy krytyczne kompilacji |
E_COMPILE_WARNING | Ostrzeżenia podczas kompilacji |
E_USER_ERROR | Komunikat o błędzie generowany przez użytkownika |
E_USER_WARNING | Komunikat ostrzegawczy wygenerowany przez użytkownika |
E_USER_NOTICE | Komunikat powiadomienia wygenerowany przez użytkownika |
E_STRICT | Sugerowanie przez PHP zmian w kodzie, które zapewnią lepszą interoperacyjność i kompatybilność kodu w przyszłości |
E_RECOVERABLE_ERROR | Błąd krytyczny możliwy do wyłapania |
E_DEPRECATED | Powiadomienie o czasie wykonywania |
E_USER_DEPRECATED | Powiadomienie o czasie wykonywania jak w przypadku E_DEPRECATED, jednakże jest generowane w kodzie PHP przy użyciu funkcji PHP |
E_ALL | Wszystkie błędy i ostrzeżenia |
PHP.ini i wyświetlanie błędów
Poniżej znajduje się kilka przykładów, jak użyć poszczególnych opcji. Na przykład, jeśli chcemy użyć pliku php.ini, możemy zrobić to w następujący sposób:
1 2 | display_errors = on error_reporting = E_ALL |
Podczas działania skryptów możemy zrobić to samo, wywołując komendę error_reporting:
1 | error_reporting(E_ALL); |
Aby włączyć rejestrowanie błędów i zapisać je w naszym własnym pliku dziennika (zamiast w domyślnym pliku dziennika, który często jest plikiem dziennika błędów serwera WWW lub pliku syslog), możemy skonfigurować PHP w następujący sposób:
1 2 | log_errors = on error_log = „/tmp/php-error.log” |
W ten sposób możemy rejestrować błędy za pomocą kodu PHP:
1 | error_log( „This code has errors!” ); |
Wyświetlanie błędów przy pomocy .htaccess
Deweloperzy, ale także osoby, które posiadają dostęp do plików instalacyjnych oprogramowania, mogą użyć pliku .htaccess do raportowania błędów. Aby tego dokonać należy w pliku zamieścić następującą wartość:
php_flag display_startup_errors on php_flag display_errors on |
.htaccess pozwala na opcjonalne włączanie i wyłączenie informacji o błędach. Dotyczy to „display_startup_errors i display_errors”. To ogromna zaleta szczególnie dla deweloperów, którzy maja możliwość stworzenia oddzielnych plików dla zespołów produkujących i kodujących. Warto też pamiętać, że w zależności od tego, do jakich plików na serwerze mamy dostęp możemy modyfikować je w celu raportowania błędów. Jednakże nie wszyscy dostawcy usług hostingowych pozwalają nam na modyfikację pliku php.ini, dlatego dobrze wiedzieć, jak zrobić to przy pomocy .htaccess. Pamiętajmy, że w tym przypadku także mamy możliwość zmiany folderu lub pliku, do którego będziemy raportować błędy, na przykład:
php_value error_log logs/all_errors.log |
Tutaj dochodzimy do etapu, w którym możemy powiedzieć o ostrzeżeniach i powiadomieniach. Wszystko dlatego, że czasami ostrzeżenia, które wydają się nie wpływać na aplikację na początkowym etapie, powodują błędy krytyczne pojawiające się tylko w pewnych warunkach. Oczywiście ostrzeżenia te muszą zostać naprawione, gdyż aplikacja nie będzie działać normalnie w niektórych scenariuszach. Kiedy błędów jest wiele, to lepszą opcją wydaje się ukrycie błędów i pokazanie jedynie komunikatów ostrzegawczych. Pomoże w tym komenda:
error_reporting(E_WARNING); |
Wyświetlanie błędów oraz powiadomień jest proste. Aby wyświetlić ostrzeżenia i powiadomienia, parametrem funkcji raportowania błędów będzie “E_WARNING | E_NOTICE”. Funkcja raportowania błędów akceptuje parametry „E_ERROR, E_WARNING, E_PARSE i E_NOTICE”.
W celu zgłoszenia wszystkich błędów, ale z pominięciem powiadomień, należy wykorzystać parametr „E_ALL & ~ E_NOTICE”, gdzie E_ALL oznacza wszystkie możliwe parametry funkcji raportowania błędów. Funkcja raportowania błędów pozwala filtrować, które błędy mają być wyświetlane. Znak „~” oznacza „nie”, więc parametr ~ E_NOTICE oznacza brak wyświetlania powiadomień. Znak „&” oznacza „prawda dla wszystkich”, podczas gdy znak „|” reprezentuje jeden wynik, o ile jest to prawda. Te dwa znaki mają to samo znaczenie w warunkach PHP co „OR” i „AND”.
Niestandardowe wyświetlanie komunikatów
Samo wyświetlanie standardowych komunikatów o błędach PHP często nie wystarcza. Dlatego możemy tworzyć własne komunikaty korzystając z funkcji set_error_handler(). Poniżej przykład:
Kiedy wystąpi błąd, wywoływana jest niestandardowa funkcja obsługi błędów z argumentem numeru błędu i argumentem ciągu błędów. Te dwa argumenty są przekazywane z wywołania set_error_handler () do naszej funkcji. Wynikiem działania tego kodu byłoby:
Error: [8] Undefined variable: foo |
Poniższy przykład pokazuje funkcję, która powinna wykryć typy błędów i zdecydować, jakie działanie podjąć i/lub jaki komunikat o błędzie wyświetlić.
Te przykłady pozwalają wyświetlać i obsługiwać typy błędów na różne sposoby oraz wyświetlać informacje o błędzie. Ważne jest, aby niestandardowa funkcja obsługi błędów była prosta i niezawodna. Istnieje kilka bibliotek PHP, które mogą pomóc w tworzeniu bardziej zaawansowanej obsługi błędów.
Błędy PHP – słowem podsumowania
Powyższy poradnik powinien pozwolić każdemu użytkownikowi PHP znaleźć i naprawić błędy, które mogą wystąpić podczas tworzenia kodu czy też uruchamiania skryptów i aplikacji. Warto znać chociażby podstawy dotyczące błędów w kodach, bo wtedy będziemy mogli przeanalizować, czy dalsze prace naprawcze jesteśmy wstanie wykonać samodzielnie, czy lepiej zlecić je wykonawcy z zewnątrz.
Bardzo fajnie przygotowana ściągawka, każdemu początkującemu w temacie na pewno się przyda 🙂