Wat is PHP-FPM en hoe werkt het precies?

Auteur: Gepubliceerd

Kort samengevat: PHP-FPM (FastCGI Process Manager) beheert de processen die PHP-code op de server uitvoeren. Het werkt samen met de webserver en beheert werkprocessen die opeenvolgende verzoeken kunnen afhandelen zonder telkens de interpreter opnieuw te starten. Dat helpt om websites, bijvoorbeeld op basis van WordPress, efficiënt te laten werken. Op zichzelf garandeert het echter geen kortere laadtijd: ook de applicatiecode, de database en de beschikbare middelen spelen een rol.

Hoe PHP-FPM een paginaverzoek afhandelt

Wanneer een gebruiker een pagina opent waarvoor PHP moet worden uitgevoerd, komt het verzoek eerst binnen bij een webserver, zoals Nginx of Apache. De server geeft de taak door aan PHP-FPM via FastCGI, een communicatieprotocol tussen de webserver en het proces dat de applicatie uitvoert. PHP-FPM wijst het verzoek toe aan een werkproces. Het resultaat van de uitgevoerde code gaat terug naar de webserver en vervolgens naar de browser.

Een werkproces is een gestart PHP-proces dat klaarstaat om een script uit te voeren. Na het afhandelen van een verzoek blijft het doorgaans beschikbaar voor het volgende, in plaats van direct te stoppen. Zo vervalt de overhead van het telkens starten van een nieuwe interpreter, zoals bij klassiek CGI.

Een voorbeeld: het openen van een dynamische pagina in WordPress kan vereisen dat PHP wordt uitgevoerd, gegevens uit de database worden gelezen en HTML wordt gegenereerd. PHP-FPM is verantwoordelijk voor het uitvoeren van het PHP-gedeelte, niet voor alle stappen die nodig zijn om de pagina te leveren. CSS-bestanden, afbeeldingen en andere statische bestanden handelt de webserver doorgaans zonder tussenkomst van PHP-FPM af.

Het verschil tussen PHP-FPM, PHP en de webserver

PHP is een taal én een omgeving die code uitvoert; PHP-FPM beheert de processen van die omgeving. Het is geen aparte taal, contentmanagementsysteem of vervanging voor Nginx of Apache. Deze onderdelen hebben verschillende functies en kunnen samenwerken.

Nginx besteedt het uitvoeren van PHP-scripts uit aan een extern mechanisme, vaak PHP-FPM. Ook Apache kan PHP-FPM gebruiken, maar er bestaan eveneens configuraties met de module mod_php, die PHP binnen de processen van Apache uitvoert. Je kunt er dus niet van uitgaan dat iedere server met PHP op dezelfde manier werkt.

PHP-FPM vervangt ook OPcache niet. OPcache bewaart gecompileerde PHP-code in het geheugen, zodat bestanden minder vaak opnieuw hoeven te worden geparseerd en gecompileerd. PHP-FPM beheert processen, terwijl OPcache een deel van het werk van die processen vermindert. Beide oplossingen kunnen elkaar dus aanvullen.

Wanneer PHP-FPM helpt en wat het niet oplost

Met PHP-FPM kun je het aantal processen regelen, evenals het starten en opnieuw aanmaken ervan. Daarmee kun je de verwerking door de applicatie afstemmen op de servercapaciteit en het aantal gelijktijdige verzoeken. Dat betekent echter niet dat inschakelen altijd een duidelijke snelheidswinst oplevert ten opzichte van iedere andere correct geconfigureerde methode om PHP uit te voeren.

Als een webwinkel lang moet wachten op een trage databasequery, zal PHP-FPM die query op zichzelf niet versnellen. Het neemt evenmin vertraging bij een externe API of rekenintensieve bewerkingen van een plug-in weg. Meer processen kunnen de database zelfs verder overbelasten of het beschikbare geheugen uitputten.

Ook het cachen van volledige pagina’s speelt een rol. Als kant-en-klare HTML kan worden teruggestuurd zonder PHP uit te voeren, houdt dat verzoek geen PHP-FPM-proces bezet. Dat ligt anders bij een winkelwagen, beheeromgeving of gepersonaliseerde pagina, waarvoor het uitvoeren van code wel nodig kan zijn.

De belangrijkste procesinstellingen

PHP-FPM groepeert processen in pools: afzonderlijk configureerbare groepen werkprocessen. Pools kunnen verschillende limieten hebben en met de rechten van verschillende systeemgebruikers draaien. Dat maakt het eenvoudiger om applicaties van elkaar te scheiden. Alleen een verdeling in pools biedt echter geen volledige beveiligingsisolatie.

De instelling pm bepaalt hoe processen beschikbaar worden gehouden:

De parameter pm.max_children bepaalt het maximale aantal werkprocessen in een pool en daarmee het aantal PHP-verzoeken dat de pool gelijktijdig kan uitvoeren. Als alle processen bezet zijn, kunnen volgende verzoeken in een wachtrij terechtkomen. Te lang wachten of overbelasting kan tot een fout leiden.

Bij een limiet van 10 processen kunnen bijvoorbeeld niet alle elf gelijktijdige verzoeken waarvoor PHP nodig is tegelijk worden uitgevoerd. Dat betekent echter niet dat de website maximaal 10 gebruikers aankan: een gebruiker houdt niet tijdens het hele bezoek een proces bezet, maar alleen terwijl een specifiek verzoek wordt afgehandeld.

Hoe controleer je of de configuratie moet worden aangepast?

Bij gedeelde hosting beheert de aanbieder doorgaans de instellingen van PHP-FPM. Mogelijk kun je in het controlepaneel alleen de versie van PHP en enkele limieten instellen. Controleer in de documentatie of bij de technische ondersteuning van je hostingaanbieder of PHP-FPM beschikbaar is, welke instellingen je kunt aanpassen en welke capaciteitslimieten gelden.

Begin op een eigen server met meten, niet met het verhogen van limieten. Controleer of de pool de limiet pm.max_children bereikt, hoeveel geheugen de processen onder belasting gebruiken en of de processor en database nog capaciteit over hebben. Het logboek voor trage verzoeken van PHP-FPM kan, mits goed geconfigureerd, helpen om code op te sporen waarvan de uitvoering lang duurt.

Een praktische volgende stap: kies één trage handeling, bijvoorbeeld het openen van de winkelwagen, en stel vast of de vertraging ontstaat door het wachten op een beschikbaar proces of door de uitvoering van de applicatie zelf. Pas op basis van die uitkomst kun je bepalen of je de limieten van PHP-FPM moet aanpassen of aan de code en database moet werken.

Zie ook: Wat betekent www?

Lees ook

Ontdek hoe BIND als open DNS-serversoftware domeinen beheert, welke rollen het vervult en wanneer zelf beheren zinvol is.
Lees wat het Poolse REGON-register en -nummer betekenen, hoe ze verschillen van NIP en KRS en hoe je bedrijfsgegevens controleert.
Ontdek hoe Security Headers je website beschermen en hoe je ze controleert en instelt zonder noodzakelijke functies te blokkeren.