Fatal error: Maximum execution time of X seconds exceeded in...

Przyczyny

Wiele administratorów serwerów konfiguruje je tak, aby PHP nie mógł zbyt długo wykonywać jednej operacji (np. importowania danych do bazy). Ma to na celu ochronę zasobów serwera (pamięć, czas procesora) przed skutkami np. błędu programistycznego. Niestety czasami ta konfiguracja jest nieadekwatna do potrzeb użytkowników i/lub mocy serwera.

Błąd spotkamy zatem z różnych przyczyn:

  • Powolna praca PHP (np. słabo zoptymalizowany lub chwilowo obciążony serwer)
  • Bardzo dużo zainstalowanych modułów
  • Import jakiegoś dużego pliku (np. z tłumaczeniem lub z dużą bazą danych)
  • Zbyt rygorystycznie ustawione limity czasowe w konfiguracji PHP (w pliku php.ini)
Rozwiązania
  1. Najpierw musimy namierzyć plik konfiguracyjny PHP, czyli php.ini. Jeśli mamy prawa administracyjne na serwerze, możemy zmienić plik globalny (sterujący pracą PHP na całym serwerze), jeśli mamy tylko konto na jakimś hostingu to musimy poszukać w panelu/pomocy jakiejś informacji o tym czy i jak możemy zmieniać konfiguracje PHP (zazwyczaj polega to na umieszczeniu w katalogu z Drupalem dodatkowego pliku php.ini zawierającego nasze "lokalne" dyrektywy konfiguracyjne
  2. Wykonujemy kopię pliku php.ini
  3. Edytujemy w pliku lub dodajemy max_execution_time = XX (XX wartość liczbowa podawana w sekundach, np. 120) najczęściej wystarczy wyedytować tylko tę wartość.
  4. Sprawdzamy czy zmienna max_execution_time się na pewno zmieniła, możemy w tym celu umieścić na serwerze plik info.php, w którym będzie kod:
    <?php
    phpinfo();
    ?>

    następnie wywołujemy ten plik z poziomu przeglądarki i szukamy zmiennej max_execution_time

  5. Operacja, która kończyła się przekroczeniem czasu powinna teraz mieć tego czasu więcej i wykonać się poprawnie

Pracując z dowolnym skryptem PHP, w trakcie długo trwających operacji możemy napotkać na komunikaty błędów związane z przekroczeniem czasu pojedynczej operacji wykonywanej przez PHP. Uniemożliwia to np. instalację Drupala, import plików z tłumaczeniem bądź bazą danych itp.

Komunikat błędu:

Fatal error: Maximum execution time of 60 seconds exceeded in ...registry.inc on line 144

ścieżka dostępu, plik i linia będą zapewne inne ale opis błędu będzie podobny.

Może się zdarzyć jeszcze podobny komunikat: MySQL :: Timeout Error