mar 21 2013
[PHP] [ERROR] Jak utworzyć prosty czytnik błędów PHP dla danej aplikacji (produkcyjnej) ?
Tworząc aplikację w PHP, trudno się nie ustrzec od popełnienia błędu. Oczywiście można w aplikacji wymusić pokazywanie stosownych komunikatów (lub w PHP.ini) i na bieżąco je kontrolować/ niwelować. Co jednak, jeśli chcemy śledzić błędy np w procesach ukrytych, które wykonują się np za pomocą ajaxa? A na domiar złego z pewnych względów wyłączone mamy raportowanie bieżących błędów? Oczywiście pozostaje zajrzeć do pliku logów, jakim domyślnie może być np php_error_log i śledzić błędy. Ale…, jeśli jakiś proces się zapętli w naszej aplikacji, to tych błędów jest tyle, że robi się słabo… Najprościej zrobić wówczas prosty czytnik pokazujący np 150 ostatnich błędów i sprawa załatwiona, nie musimy niczego dodatkowo ciągle otwierać, odświeżać, a ponadto monitorujemy stan aplikacji nawet procesów, których nie widzimy, np wywoływanych ajaxem, czy cronem.
Krok pierwszy, to ustalić, gdzie taki plik się zapisuje/nadpisuje… Oczywiście zaglądamy ponownie do php.ini i sprawdzamy odpowiedni zapis. Na potrzeby danej aplikacji, można go zwyczajnie przenieść w inne miejsce, z którego wygodniej już będziemy go mogli odczytywać np funkcją fopen, czy file. Dla przykładu dla xammp mamy taki zapis:
1 | error_log = "C:\xampp\htdocs\nasza_aplikacja\log\php_error_log" |
A w kroku 2 tworzymy moduł/plik, który następnie includujemy w odpowiednie miejsce w aplikacji i gotowe. Przykładowo może on wyglądać tak:
1 2 3 4 5 6 7 8 9 10 11 | <? error_reporting(0) ; echo "<table ><thead><tr><th>Log</th></tr></thead>"; $lista = file('log/php_error_log'); $lista = array_reverse($lista);$x=0; foreach ($lista as $l) {if(ereg("\[(.*)\]", $l) and $x<150) { echo "<tr> <td>".$l."</td> </tr>"; $x++;}} echo '</table>'; ?> |
Krótko i na temat. Czytamy wspak dodające się błędy dzięki funkcji array_reverse i ograniczamy ilość linii zmienną $x. Proste? Error_reporting(0) opcjonalnie.
PS log, jaką czyta ten skrypt tworzy się dla PHP Version 5.3.8. Prawdopodobnie działa i z innymi. Nie testowałem.