Rozwiązanie problemu z “Maximum execution time exceeded” w PHP
Krzysztof Karolczak | 24.07.2008Komunikat krytycznego wyjątku PHP Maximum execution time of 30 seconds exceeded pojawiający się, gdy czas wykonania naszej aplikacji przekroczy 30 sekund, może być bardzo uciążliwy przy odpalaniu “cięższych” skryptów na serwerze, np. przy obróbce dużej ilości danych. Błąd ten jest również częstym gościem na ekranach tych, którzy używają serwerów Apacha zainstalowanych na systemach Windowsowych
(choćby i przy testowaniu projektów Symfony na domowym PC). Jednakże istnieje kilka szybkich i łatwych sposobów by zaradzić tej niedogodności :)!
Rozwiązanie 1 - Gdy mamy dostęp do plików konfiguracyjnych PHP.
Jeśli możemy wyedytować pliki konfiguracyjne PHP to problem sprowadza się jedynie do zmiany jednej linijki w PHP.ini. Plik ten zanjduje się zazwyczaj w głównym katalogu PHP (np. w moje instalacji PHP WAMP jest on w C:\wamp\bin\php\php5.2.5), wystarczy go otworzyć i odnaleźć linijkę:
max_execution_time = 30
Zmiana domyślnych 30 sekund na powiedzmy 120 powinna rozwiązać problem dla większości skryptów (normalnych skryptów ;)). Jedyne co nam pozostało to restart serwera www i jesteśmy w domku.
Rozwiązanie 2 - Na maszynie zdalnej.
Jest taka ładna funkcja PHP, która zwie się set_time_limit ( int $sec ), każde jej wywołanie ustawia licznik timeoutu na żądaną wartość (w sekundach) co oznacza że skrypt będzie mógł działać od teraz przez $sec sekund. Wywołanie set_time_limit(0) znosi ograniczenie czasu wykonania aplikacji.
Niestety funkcja ta nie będzie działać, jeśli PHP na serwerze działa w trybie bezpiecznym (safe mode). Więcej szczegółów można znaleźć w podręczniku PHP.
Timeout i serwery WWW
Warto wspomnieć iż serwery www również mają określony maksymalny dopuszczalny czas wykonania zapytania, np. dla Apacha domyślna wartość wynosi 300 sekund. 6 minut to więcej niż będzie nam potrzebne w 99,99% przypadków (czy w obecnych czasach wytrzymalibyście czekanie 5 minut aż się otworzy jakaś strona?
), ale istnieje oczywiście możliwość zmiany tych ustawień. Wystarczy odszukać linijkę zaczynającą sie od słowa Timeout w pliku httpd-default.conf który znajduje się razem z innym plikami konfiguracyjnymi Apacha (np. u mnie jest to C:\wamp\bin\apache\apache2.2.6\conf\extra).





