...

PHP-uitvoeringslimieten: reële gevolgen voor prestaties en stabiliteit

PHP-uitvoeringslimieten hebben een merkbare invloed op de snelheid waarmee verzoeken worden verwerkt en op de betrouwbaarheid waarmee een webserver onder belasting reageert. Ik laat zien welke tijdslimieten hoe ze samenwerken met het geheugen en de CPU en welke instellingen websites zoals WordPress en webwinkels stabiel en snel houden.

Centrale punten

  • Uitvoeringstijd regelt hoe lang scripts mogen draaien en bepaalt time-outs en foutpercentages.
  • Geheugenlimiet en Execution Time werken samen en beïnvloeden laadtijden en stabiliteit.
  • Hosting tuning (php.ini, PHP‑FPM) voorkomt blokkades door lange scripts en te veel workers.
  • WordPress/Winkel heeft ruime limieten nodig voor imports, back-ups, updates en cron-jobs.
  • Controle van CPU, RAM en FPM-status brengt knelpunten en onjuiste limieten aan het licht.

Basisprincipes: wat de uitvoeringstijd werkelijk meet

De richtlijn max_uitvoering_tijd bepaalt hoeveel seconden een PHP-script maximaal actief kan rekenen voordat het wordt afgebroken. De timer start pas wanneer PHP begint met het uitvoeren van het script, niet bij het uploaden van het bestand of wanneer de webserver het verzoek accepteert. Verzoeken aan de database, loops en template-rendering tellen volledig mee in de tijd, wat vooral merkbaar is bij een zwakkere CPU. Als een script de limiet bereikt, beëindigt PHP de uitvoering en stuurt een foutmelding zoals „Maximum execution time exceeded“. Ik zie in logs vaak dat een vermeende vastloper simpelweg te wijten is aan de Time-out ligt, veroorzaakt door een te krappe specificatie.

Typische standaardinstellingen variëren tussen 30 en 300 seconden, waarbij shared hosting meestal strikter is. Deze instellingen beschermen de server tegen eindeloze loops en blokkerende processen die andere gebruikers zouden vertragen. Te strikte waarden hebben echter invloed op normale taken zoals het genereren van afbeeldingen of XML-parsing, die bij veel verkeer langer duren. Hogere limieten redden rekenintensieve taken, maar kunnen een instantie overbelasten als er meerdere lange verzoeken tegelijkertijd worden uitgevoerd. In de praktijk test ik in stappen en vergelijk ik de uitvoeringstijd met Geheugen, CPU en parallelliteit.

Reële gevolgen: prestaties, foutenpercentage en gebruikerservaring

Een te laag tijdslimiet veroorzaakt harde afbrekingen, die gebruikers als defecte pagina's ervaren. WordPress-updates, bulkbeeldoptimalisaties of grote WooCommerce-exports bereiken snel de limiet, wat de laadtijden opdrijft en transacties in gevaar brengt. Als ik de uitvoeringstijd verhoog naar 300 seconden en tegelijkertijd OPcache uitrol, dalen de responstijden merkbaar omdat PHP minder opnieuw compileert. Bij krappe limieten zie ik ook een hogere CPU-belasting, omdat scripts meerdere keren opnieuw starten in plaats van één keer netjes af te lopen. De ervaren Prestaties hangt dus niet alleen af van de code, maar ook rechtstreeks van zinvol vastgestelde grenswaarden.

Te hoge waarden zijn geen vrijbrief, want langlopende processen belasten PHP-workers en blokkeren andere verzoeken. Op gedeelde systemen leidt dit tot een bottleneck voor alle buren; op VPS of dedicated servers kan de machine in swap terechtkomen. Ik houd me aan een vuistregel: zo hoog als nodig, zo laag als mogelijk, en altijd in combinatie met caching. Als een proces regelmatig erg lang duurt, verplaats ik het naar een queue-worker of voer ik het uit als een geplande taak. Zo blijven frontend-verzoeken kort, terwijl arbeidsintensieve taken in de Achtergrond rennen.

Praktijk: WordPress- en shop-stacks zonder time-outs gebruiken

WordPress met veel plug-ins en paginabouwers profiteert van 256-512 MB Geheugen en 300 seconden uitvoeringstijd, vooral bij media-importen, back-ups en beveiligingsopdrachten. Thema-compilatie, REST-oproepen en cron-events worden beter verdeeld wanneer OPcache actief is en een objectcache resultaten opslaat. Voor WooCommerce houd ik ook rekening met lange DB-query's en API-verzoeken voor betalings- en verzendservices. Een deel van de stabiliteit komt voort uit een zorgvuldige selectie van plug-ins: minder redundantie, geen verweesde add-ons. Wie veel gelijktijdige verzoeken heeft, moet PHP-workers correct dimensioneren, zodat frontend-pagina's altijd een vrije Proces ontvangen.

Winkelsystemen met sitemaps, feeds en ERP-synchronisatie genereren pieken die de standaardlimieten overschrijden. Importroutines hebben meer looptijd nodig, maar ik verpak ze in taken die buiten de webverzoeken om worden uitgevoerd. Als dat niet te scheiden is, stel ik tijdvensters in tijdens uren met weinig verkeer. Zo ontlast ik het frontendverkeer en minimaliseer ik botsingen met campagnes of verkoopevenementen. Een duidelijk plan vermindert Fout voelbaar en beschermt conversieflows.

Hosting Tuning: php.ini, OPcache en zinvolle grenswaarden

Ik begin met conservatieve waarden en verhoog deze gericht: max_execution_time = 300, memory_limit = 256M, OPcache actief en objectcache op applicatieniveau. Daarna observeer ik piekbelastingen en pas ik deze in kleine stapjes aan, in plaats van willekeurig hoge waarden in te stellen. Grenzen in te stellen. Voor Apache kan .htaccess waarden overschrijven; bij Nginx gebeurt dit door poolconfiguraties en PHP-FPM-instellingen. Het is belangrijk om na elke wijziging te herladen, zodat de nieuwe instellingen daadwerkelijk van kracht worden. Wie zijn omgeving kent, haalt meer uit dezelfde hardware. Prestaties.

Bij het monitoren let ik op het 95e percentiel van de responstijden, foutpercentages en RAM-gebruik per proces. Als een taak regelmatig langer dan 120 seconden duurt, controleer ik codepaden, queryplannen en externe diensten. Compacte code met duidelijke afbreekvoorwaarden verkort de looptijden aanzienlijk. Daarnaast is het de moeite waard om uploadlimieten, post_max_size en max_input_vars op elkaar af te stemmen, zodat verzoeken niet mislukken vanwege nevenfactoren. Een goede configuratie voorkomt kettingreacties van Time-outs en herhalingen.

PHP‑FPM: processen, parallelliteit en pm.max_children

Het aantal gelijktijdige PHP-processen bepaalt hoeveel verzoeken parallel kunnen worden uitgevoerd. Te weinig workers leiden tot wachtrijen, te veel nemen te veel RAM in beslag en dwingen het systeem tot swappen. Ik breng pm.max_children in evenwicht met memory_limit en het gemiddelde gebruik per proces en test vervolgens met echt verkeer. De sweet spot houdt de latentie laag zonder de host te swappen . Wie zich hier verder in wil verdiepen, vindt bij pm.max_children optimaliseren concrete benaderingen voor het sturen van de Werknemer.

Naast het pure aantal tellen ook startparameters zoals pm.start_servers en pm.min_spare_servers mee. Als kinderen te agressief worden gespawnd, verslechtert dit de koude starttijden en fragmentatie. Ik kijk ook naar hoe lang verzoeken bezet blijven, vooral bij externe API's. Een te hoge time-outtolerantie bindt resources die beter vrij zouden kunnen zijn voor nieuwe verzoeken. Uiteindelijk telt de korte verblijfsduur per Verzoek meer dan de maximale looptijd.

Interactie: uitvoeringstijd, geheugenlimiet en garbage collection

Weinig RAM dwingt frequente garbage collection af, wat rekenkracht kost en scripts dichter bij de Time-out schuift. Als ik de geheugenlimiet matig verhoog, daalt het aantal GC-cycli en lijkt de uitvoeringstijd „langer“ te duren. Dit geldt met name voor gegevensintensieve processen zoals parsers, exporten of beeldtransformaties. Voor uploads harmoniseer ik upload_max_filesize, post_max_size en max_input_vars, zodat verzoeken niet mislukken vanwege invoerlimieten. Meer achtergrondinformatie over RAM-effecten vat ik samen in dit overzicht: Geheugenlimiet en RAM-gebruik, die de praktische verbanden belicht.

Ook OPcache werkt als een vermenigvuldigingsfactor: minder compilaties betekenen kortere CPU-tijd per verzoek. Een objectcache vermindert zware DB-reads en stabiliseert reactietijden. Zo verandert een krap tijdsvenster in stabiele doorlooptijden, zonder de limiet verder te verhogen. Ten slotte versnellen geoptimaliseerde indexen en afgeslankte queries de weg naar het antwoord. Elke milliseconde die in de toepassing wordt bespaard, ontlast de Grenswaarden op systeemniveau.

Meting en monitoring: gegevens in plaats van onderbuikgevoel

Ik meet eerst, dan pas ik aan: FPM-status, toegangslogs, foutenlogs en statistieken zoals CPU, RAM en I/O zorgen voor duidelijkheid. Bijzonder nuttig zijn het 95e en 99e percentiel, die uitschieters zichtbaar maken en optimalisaties objectiveren. Na elke aanpassing controleer ik of het foutenpercentage daalt en de responstijden stabiel blijven. Herhaalde belastingstests bevestigen of de nieuwe Setting ook bij piekverkeer. Zonder cijfers worden alleen symptomen verspreid in plaats van echte Oorzaken op te lossen.

Voor inzicht in applicaties helpen profileringstools en query-logs, die dure paden blootleggen. Ik log externe API's apart om trage partnerdiensten te scheiden van lokale problemen. Als time-outs voornamelijk bij derde partijen voorkomen, verhoog ik daar selectief de tolerantie of stel ik circuit breakers in. Een duidelijke scheiding versnelt de foutanalyse en houdt de focus op het deel met de grootste hefboomwerking. Zo blijft het totale platform bestand tegen individuele zwakke punten.

Langlopende taken: jobs, wachtrijen en cron

Taken zoals exporten, back-ups, migraties en beeldstapels horen thuis in achtergrondprocessen, niet in de frontend-request. Ik gebruik queue-workers of CLI-scripts met aangepaste Runtime en afzonderlijke limieten om frontends vrij te houden. Ik plan cron-taken in rustige tijdvensters, zodat ze geen invloed hebben op het liveverkeer. Voor fouttolerantie bouw ik retry-strategieën met backoff in, in plaats van vaste herhalingen te gebruiken. Zo lopen lange taken betrouwbaar, zonder gebruikersstromen te verstoren. storen.

Als een taak toch in de webcontext terechtkomt, zet ik in op gestreamde antwoorden en tussentijdse opslag van tussenresultaten. Voortgangsindicatoren en gedeeltelijke verwerking in batches voorkomen lange blokkades. Als het toch krap wordt, schaal ik tijdelijk het aantal workers op en breng ik het daarna weer terug naar het normale niveau. Deze flexibiliteit houdt de kosten berekenbaar en spaart middelen. Het blijft cruciaal om kritieke paden kort te houden en zware runs uit het gebruikerspad te weren. verplaatsen.

Veiligheidsaspecten en fouttolerantie bij hoge limieten

Hogere uitvoeringswaarden verlengen het venster waarin foutieve code resources bindt. Ik beveilig dit door zinvolle Afbrekingen in de code, invoervalidatie en limieten voor externe oproepen. Rate-limiting op API-ingangen voorkomt overstromingen van langlopers door bots of misbruik. Aan de serverzijde stel ik harde proces- en geheugenlimieten in om runaway-processen te stoppen. Een meerfasig beveiligingsconcept vermindert de schade, zelfs als een enkele Verzoek ontspoord.

Ik ontwerp foutpagina's informatief en kort, zodat gebruikers zinvolle stappen zien in plaats van cryptische meldingen. Ik sla logbestanden gestructureerd op en roteer ze om schijfruimte te besparen. Ik koppel waarschuwingen aan drempelwaarden die echte problemen markeren, niet elk kleinigheidje. Zo kan het team snel reageren op echte incidenten en blijft het bij storingen handelingsbekwaam. Goede observability verkort de tijd tot Oorzaak drastisch.

Veelvoorkomende misvattingen over limieten

„Hoger is altijd beter“ klopt niet, omdat te lange scripts het platform blokkeren. „Alles is een CPU-probleem“ gaat te kort door de bocht, omdat RAM, IO en externe diensten de toon aangeven. „OPcache is voldoende“ gaat voorbij aan het feit dat DB-latentie en netwerk ook meetellen. „Alleen code optimaliseren“ gaat voorbij aan het feit dat configuratie en hosting-setup hetzelfde effect hebben. Ik combineer code-refactor, caching en Configuratie, in plaats van op een hefboom te zetten.

Een andere denkfout: „Time-out betekent defecte server“. In werkelijkheid duidt dit meestal op ongeschikte limieten of ongelukkige paden. Wie logs leest, herkent patronen en lost de juiste punten op. Daarna neemt het foutenpercentage af, zonder dat er hardware hoeft te worden vervangen. Een duidelijke diagnose bespaart kosten. Budget en versnelt zichtbare resultaten.

Voorbeeldconfiguraties en benchmarks: wat werkt in de praktijk

Ik baseer me op typische belastingsprofielen en stem deze af op het RAM-budget en de parallelliteit. De volgende tabel geeft een overzicht van veelvoorkomende combinaties en laat zien hoe deze van invloed zijn op de responstijd en stabiliteit. De waarden dienen als uitgangspunt en moeten worden afgestemd op het verkeer, de codebasis en externe diensten. Na de uitrol controleer ik de statistieken en blijf ik in kleine stapjes bijschaven. Zo blijft het systeem planbaar en reageert niet gevoelig op belastingspieken.

Operationeel scenario Uitvoeringstijd Geheugenlimiet Verwacht effect Risico
Kleine WP-pagina, weinig plug-ins 60–120 s 128–256 MB Stabiele updates, zeldzame time-outs Pieken bij banen in de media
Blog/Corporate met Page Builder 180–300 s 256–512 MB Halve responstijd, minder onderbrekingen Lange lopers bij slechte DB
WooCommerce/Winkel 300 s 512 MB Stabiele imports, back-ups, feeds Hoog RAM-geheugen per werknemer
API/Headless backends 30–120 s 256–512 MB Zeer korte latentie met OPcache Time-outs bij trage partners

Als u veel gelijktijdige verzoeken hebt, moet u ook de PHP-FPM-pool aanpassen en regelmatig controleren. Een toename van het aantal workers zonder RAM-tegenwaarde verergert de bottleneck. Zuinige processen met OPcache en objectcache verbeteren de doorvoer per kern. Al met al gaat het om de balans, niet om de maximale waarden op een enkele regelaar. Precies hier loont gestructureerd Afstemmen van.

Gerelateerde limieten: max_input_time, request_terminate_timeout en upstream-time-outs

Naast max_execution_time spelen meerdere buren een rol: max_input_time beperkt de tijd die PHP heeft om de invoer (POST, uploads) te parseren. Als deze limiet te laag is, mislukken grote formulieren of uploads voordat de eigenlijke code start – volledig onafhankelijk van de uitvoeringstijd. Op FPM-niveau beëindigt verzoek_terminate_timeout te lange verzoeken hard, zelfs als PHP nog niet de uitvoeringslimiet heeft bereikt. Webservers en proxies stellen hun eigen limieten: Nginx (proxy_read_timeout/fastcgi_read_timeout), Apache (Timeout/ProxyTimeout) en Load‑Balancer/CDNs breken antwoorden af na een bepaalde wachttijd. In de praktijk geldt: het kleinste effectieve time-out wint. Ik houd deze keten consistent, zodat geen onzichtbare externe barrière de diagnose verstoort.

Externe diensten zijn bijzonder verraderlijk: als een PHP-verzoek op een API wacht, bepaalt niet alleen de uitvoeringstijd, maar ook de HTTP-clientconfiguratie (connect/read-time-outs) het resultaat. Als je hier geen duidelijke deadlines stelt, worden workers onnodig lang bezet. Daarom definieer ik voor elke integratie korte verbindings- en responstime-outs en beveilig ik kritieke paden met een retry-beleid en circuit breakers.

CLI versus web: andere regels voor achtergrondtaken

CLI-processen gedragen zich anders dan FPM: standaard is de max_uitvoering_tijd bij CLI vaak ingesteld op 0 (onbeperkt), het geheugenlimiet blijft echter van kracht. Voor lange imports, back-ups of migraties kies ik bewust voor de CLI en stel ik limieten in via parameters:

php -d max_execution_time=0 -d memory_limit=512M bin/job.php

Zo ontkoppel ik de looptijdbelasting van frontend-verzoeken. In WordPress voer ik zware taken bij voorkeur uit via WP-CLI en laat ik Web-Cron alleen korte, herstartbare taken activeren.

Wat de code zelf kan regelen: set_time_limit, ini_set en afbrekingen

Applicaties kunnen beperkingen binnen het kader van de serverinstellingen opheffen: set_time_limit() en ini_set(‚max_execution_time‘) werken per verzoek. Dit werkt alleen als de functies niet zijn gedeactiveerd en er geen lagere FPM-time-out van toepassing is. Daarnaast stel ik expliciete afbreekcriteria in lussen in, controleer ik de voortgang en log ik fasen. ignore_user_abort(true) maakt het mogelijk om taken af te ronden ondanks een verbroken clientverbinding – handig voor exports of webhooks. Zonder nette stops brengen dergelijke vrijbriefjes echter de stabiliteit in gevaar; daarom blijven ze de uitzondering met duidelijke beveiligingen.

Capaciteitsplanning: pm.max_children berekenen in plaats van gissen

In plaats van pm.max_children blindelings te verhogen, reken ik met de werkelijke geheugenbehoefte. Hiervoor meet ik het gemiddelde RSS van een FPM-proces onder belasting (bijv. via ps of smem) en houd rekening met reserve voor kernel/pagecache. Een eenvoudige benadering:

beschikbare_RAM_voor_PHP = totale_RAM - database - webserver - OS-reserve pm.max_children ≈ floor(beschikbare_RAM_voor_PHP / Ø_RSS_per_PHP-proces)

Belangrijk: geheugenlimiet is geen RSS-waarde. Een proces met een limiet van 256 MB neemt, afhankelijk van de workflow, 80-220 MB in beslag. Ik kalibreer daarom met echte metingen in de piek. Als de Ø-RSS wordt gedrukt door caching en minder extensieballast, passen er meer workers in hetzelfde RAM-budget – vaak effectiever dan een ruwe verhoging van de limieten.

Externe afhankelijkheden: bewust time-outs instellen

De meeste „hangende“ PHP-verzoeken wachten op IO: database, bestandssysteem, HTTP. Voor databases definieer ik duidelijke query-limieten, indexstrategieën en transactiekaders. Voor HTTP-clients stel ik korte connect- en read-time-outs en beperk het aantal herpogingen tot een paar, exponentieel vertraagde pogingen. In de code ontkoppel ik externe oproepen door resultaten te cachen, te parallelliseren (waar mogelijk) of uit te besteden aan jobs. Dit vermindert de kans dat een enkele trage partner de volledige FPM-wachtrij blokkeert.

Batching en hervatbaarheid: lange runs temmen

Ik verdeel lange operaties in duidelijk omschreven Batches (bijv. 200-1000 gegevensrecords per run) met checkpoints. Dit verkort de afzonderlijke verzoektijden, vergemakkelijkt het hervatten na fouten en verbetert de zichtbaarheid van de voortgang. Praktische bouwstenen:

  • Voortgangsmarkering (laatste ID/pagina) permanent opslaan.
  • Idempotente bewerkingen om dubbele runs te tolereren.
  • Backpressure: batchgrootte dynamisch verminderen wanneer het 95e percentiel stijgt.
  • Streaming-antwoorden of server-sent events voor live feedback bij beheertaken.

Samen met OPcache en Object Cache zorgen ze voor stabiele, voorspelbare looptijden die binnen realistische grenzen blijven, in plaats van de uitvoeringstijd globaal te verhogen.

FPM-slowlog en zichtbaarheid in geval van fouten

Voor echt inzicht activeer ik de FPM-slowlog (request_slowlog_timeout, slowlog-pad). Als verzoeken langer dan de drempelwaarde actief blijven, komt er een backtrace in het logboek terecht – goud waard bij onduidelijke vastlopers. Tegelijkertijd levert de FPM-status (pm.status_path) live cijfers over actieve/inactieve processen, wachtrijen en verzoekduur. Ik correleer deze gegevens met toegangslogs (upstream-tijd, statuscodes) en DB-slow-logs om de knelpunten nauwkeurig te identificeren.

Containers en VM's: Cgroups en OOM in beeld

In containers beperkt de orkestratie CPU en RAM onafhankelijk van php.ini. Als een proces dicht bij de geheugenlimiet, kan de kernel ondanks de „juiste“ PHP-instelling de container via OOM-killer beëindigen. Daarom houd ik een extra reserve aan onder de cgroup-limiet, observeer ik RSS in plaats van alleen memory_limit en stem ik OPcache-groottes conservatief af. In CPU-beperkte omgevingen worden de looptijden langer – dezelfde uitvoeringstijd is dan vaak niet meer voldoende. Hier helpen profilering en gerichte parallelliteitsreductie meer dan algemeen hogere time-outs.

PHP-versies, JIT en extensies: kleine aanpassingen, groot effect

Nieuwere PHP-versies brengen merkbare optimalisaties van de engine met zich mee. De JIT versnelt typische webworkloads zelden drastisch, terwijl OPcache dat bijna altijd doet. Ik houd extensies slank: elke extra bibliotheek verhoogt het geheugengebruik en de kosten voor een koude start. Ik pas realpath_cache_size en OPcache-parameters (geheugen, hervalidatiestrategie) aan de codebasis aan. Deze details verkorten het CPU-gebruik per verzoek, wat bij constante tijdslimieten direct meer headroom oplevert.

Foutpatronen herkennen: een korte checklist

  • Veel 504/502 onder belasting: te weinig workers, externe service traag, proxy-time-out kleiner dan PHP-limiet.
  • „Maximum execution time exceeded“ in het foutenlogboek: codepad/query duur of time-out te kort – profilering en batchverwerking.
  • RAM schommelt, swap stijgt: pm.max_children te hoog of Ø‑RSS onderschat.
  • Regelmatige time-outs bij uploads/formulieren: max_input_time/post_max_size/client-time-outs harmoniseren.
  • Backend traag, frontend ok: Object‑Cache/OPcache in admin-gebieden te klein of uitgeschakeld.

Kort samengevat

PHP-uitvoeringslimieten bepalen hoe snel verzoeken worden uitgevoerd en hoe betrouwbaar een pagina blijft tijdens pieken. Ik stel de uitvoeringstijd en Geheugen nooit geïsoleerd, maar afgestemd op CPU, FPM-worker en caching. Voor WordPress en winkels werken 300 seconden en 256-512 MB als een haalbare start, aangevuld met OPcache en objectcache. Daarna pas ik aan op basis van 95. percentiel, foutpercentage en RAM-gebruik, totdat de knelpunten verdwijnen. Met deze methode krimpen Time-outs, de site blijft snel reageren en de hosting blijft voorspelbaar.

Huidige artikelen