✦ Oplossingen · PHP-fouten

PHP Fatal error: Maximum execution time exceeded

'Maximum execution time of 30 seconds exceeded' betekent dat een PHP-script te lang duurde. Zo verhoog je max_execution_time verantwoord en maak je de taak sneller of opgeknipt.

Waarom gebeurt dit?

Met max_execution_time bepaalt PHP hoe lang een script maximaal mag rekenen. Gaat het daaroverheen, dan stopt PHP met Fatal error: Maximum execution time of 30 seconds exceeded. Dat beschermt de server tegen scripts die vastlopen.

Je ziet de fout vaak bij imports, back-ups, updates van grote plugins of het verwerken van veel afbeeldingen. Let op: ook de webserver of proxy heeft eigen tijdslimieten. Als die eerder ingrijpen, krijg je geen PHP-melding maar een 504 Gateway Timeout.

Zo los je het op, stap voor stap

Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.

  1. Zoek welke taak te lang duurt

    Het bestand en het regelnummer in de foutmelding laten zien waar het script was toen de tijd op was. Dat is niet altijd de oorzaak, maar wel de plek om te beginnen, bijvoorbeeld een externe API-aanroep die blijft wachten.

  2. Verhoog de limiet waar dat verantwoord is

    Voor een eenmalige zware taak mag de limiet omhoog. Stel hem in via het hostingpaneel, php.ini of .user.ini. In code kan het ook, voor alleen dat ene script.

    ; php.ini of .user.ini
    max_execution_time = 120
    
    <?php
    // alleen voor dit script, als de hoster het toestaat
    set_time_limit(120);
  3. Stem de webserver erop af

    Bij nginx met PHP-FPM bepaalt ook fastcgi_read_timeout hoe lang nginx op PHP wacht, en PHP-FPM kent request_terminate_timeout. Staat één daarvan lager dan max_execution_time, dan wint de laagste.

    # nginx, in het location-blok voor PHP
    fastcgi_read_timeout 120s;
  4. Knip lange taken op

    Verwerk records in batches (bijvoorbeeld per 200) en laat elke batch een nieuwe aanvraag of een cronjob zijn. Zo blijft elke stap ruim binnen de tijd en kun je bij een fout verdergaan waar je was.

  5. Geef externe aanroepen een timeout

    Wacht een script op een andere server, geef die aanroep dan een eigen, korte timeout, zodat één trage dienst niet je hele pagina laat vastlopen.

    <?php
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $antwoord = curl_exec($ch);

Let op: Vanaf de opdrachtregel (PHP CLI) staat max_execution_time standaard op 0, dus onbeperkt. Zware taken horen daarom vaak in een cronjob of een CLI-opdracht, niet in een webpagina.

Lukt het niet? Wij helpen

Kom je er met deze stappen niet uit, of wil je het liever niet zelf doen? We kijken online mee of komen langs. Hulp op afstand kost €20 per uur; komen we langs, dan is de prijs op aanvraag. Je weet vooraf waar je aan toe bent.

Aanvraag

Hulp aanvragen

Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.

Veelgestelde vragen

Vragen over dit probleem

Telt wachten op de database mee voor max_execution_time?

Op Linux telt max_execution_time alleen de tijd dat het script zelf rekent; wachten op database, bestanden of netwerk telt niet mee. Daarom kan een pagina veel langer duren dan de limiet zonder deze fout, en grijpt dan vaak de webserver in met een 504.

Is max_execution_time = 0 een goed idee?

Niet voor webpagina's. Een vastgelopen script blijft dan een PHP-proces bezet houden. Gebruik een ruime maar eindige waarde, en zet echte langlopers in een cronjob of CLI-script.

De fout komt bij het updaten van WordPress.

Probeer de update opnieuw; vaak lukt het de tweede keer. Blijft het misgaan, update dan plugin voor plugin, of laat de hosting de tijdslimiet tijdelijk verhogen.