PHP-FPM: Funktionsweise und Einstellungen
Autor: Redaktion Domeny.ForSale Veröffentlicht
Kurz erklärt: PHP-FPM (FastCGI Process Manager) verwaltet Prozesse, die PHP-Code auf dem Server ausführen. Es arbeitet mit dem Webserver zusammen und steuert Worker-Prozesse, die mehrere Anfragen nacheinander bearbeiten können, ohne jedes Mal den Interpreter neu zu starten. Das erleichtert den effizienten Betrieb von Websites, etwa auf Basis von WordPress. Kürzere Ladezeiten garantiert es allein jedoch nicht — auch der Anwendungscode, die Datenbank und die verfügbaren Ressourcen spielen eine Rolle.
Wie PHP-FPM eine Seitenanfrage verarbeitet
Wenn ein Nutzer eine Seite öffnet, für die PHP ausgeführt werden muss, erreicht die Anfrage zunächst einen Webserver wie Nginx oder Apache. Dieser übergibt die Aufgabe über FastCGI an PHP-FPM. FastCGI ist ein Kommunikationsprotokoll zwischen dem Webserver und dem Prozess, der die Anwendung ausführt. PHP-FPM weist die Anfrage einem Worker-Prozess zu. Das Ergebnis der Codeausführung gelangt zurück an den Webserver und anschließend an den Browser.
Ein Worker-Prozess ist ein laufender PHP-Prozess, der bereit ist, ein Skript auszuführen. Nach der Bearbeitung einer Anfrage bleibt er normalerweise für die nächste verfügbar, statt sich sofort zu beenden. Dadurch entfällt der Aufwand, wie beim klassischen CGI jedes Mal einen neuen Interpreter zu starten.
Beispielsweise kann der Aufruf einer dynamischen Unterseite von WordPress erfordern, PHP auszuführen, Daten aus der Datenbank zu lesen und HTML zu erzeugen. PHP-FPM ist für die Ausführung des PHP-Anteils zuständig, nicht für sämtliche Schritte der Seitenauslieferung. CSS-Dateien, Bilder und andere statische Ressourcen liefert der Webserver normalerweise ohne seine Beteiligung aus.
Wie sich PHP-FPM von PHP und einem Webserver unterscheidet
PHP bezeichnet die Sprache und die Laufzeitumgebung, die den Code ausführt. PHP-FPM verwaltet die Prozesse dieser Umgebung. Es ist weder eine eigene Sprache noch ein Content-Management-System oder ein Ersatz für Nginx oder Apache. Diese Komponenten erfüllen unterschiedliche Aufgaben und können zusammenarbeiten.
Nginx übergibt die Ausführung von PHP-Skripten an eine externe Komponente, häufig PHP-FPM. Auch Apache kann PHP-FPM verwenden. Es gibt allerdings ebenso Konfigurationen mit dem Modul mod_php, das PHP innerhalb der Apache-Prozesse ausführt. Man sollte daher nicht davon ausgehen, dass jeder Server mit PHP auf dieselbe Weise arbeitet.
PHP-FPM ersetzt auch OPcache nicht. OPcache hält kompilierten PHP-Code im Speicher vor und verringert so die Notwendigkeit, Dateien erneut zu parsen und zu kompilieren. PHP-FPM verwaltet die Prozesse, während OPcache einen Teil ihrer Arbeit reduziert — beide Lösungen können sich ergänzen.
Wann PHP-FPM hilft und was es nicht behebt
Mit PHP-FPM lassen sich die Anzahl der Prozesse sowie ihr Start und ihre Neuerstellung steuern. So lässt sich die Verarbeitung der Anwendung an die Serverressourcen und die Zahl gleichzeitiger Anfragen anpassen. Das bedeutet jedoch nicht, dass seine Aktivierung gegenüber jeder anderen korrekt konfigurierten Methode zur Ausführung von PHP immer eine deutliche Beschleunigung bringt.
Wenn ein Shop lange auf eine langsame Datenbankabfrage wartet, verkürzt PHP-FPM allein deren Laufzeit nicht. Ebenso wenig beseitigt es Verzögerungen einer externen API oder aufwendige Vorgänge eines Plugins. Eine höhere Prozesszahl kann die Überlastung der Datenbank sogar verstärken oder den verfügbaren Arbeitsspeicher aufbrauchen.
Auch ein Cache für vollständige Seiten spielt eine Rolle. Wenn fertiges HTML ausgeliefert werden kann, ohne PHP auszuführen, belegt diese Anfrage keinen PHP-FPM-Prozess. Anders sieht es bei einem Warenkorb, einem Administrationsbereich oder einer personalisierten Seite aus, für die eine Codeausführung erforderlich sein kann.
Die wichtigsten Prozesseinstellungen
PHP-FPM fasst Prozesse in Pools zusammen, also in getrennt konfigurierbaren Gruppen von Worker-Prozessen. Pools können unterschiedliche Limits haben und mit den Berechtigungen verschiedener Systembenutzer laufen. Das erleichtert die Trennung von Anwendungen. Die Aufteilung in Pools allein stellt jedoch keine vollständige sicherheitstechnische Isolation dar.
Wie Prozesse vorgehalten werden, bestimmt die Einstellung pm:
static— hält eine feste Anzahl von Prozessen vor. Dadurch ist ihre Anzahl gut vorhersehbar, sie belegen aber auch bei wenig Traffic Arbeitsspeicher.dynamic— passt die Prozesszahl innerhalb festgelegter Grenzen an und hält eine Reserve untätiger Prozesse bereit.ondemand— startet Prozesse beim Eintreffen von Anfragen und beendet sie nach einer Zeit der Inaktivität. Das senkt den Speicherverbrauch in Ruhephasen, erfordert nach einer Pause aber das erneute Starten von Prozessen.
Der Parameter pm.max_children legt die maximale Anzahl der Worker-Prozesse in einem Pool fest und damit auch die Zahl der PHP-Anfragen, die der Pool gleichzeitig ausführen kann. Sind alle Prozesse belegt, können weitere Anfragen in einer Warteschlange warten. Zu lange Wartezeiten oder eine Überlastung können zu einem Fehler führen.
Ein Beispiel: Bei einem Limit von 10 Prozessen können elf gleichzeitig eintreffende Anfragen, die PHP benötigen, nicht alle gleichzeitig ausgeführt werden. Das bedeutet jedoch kein Limit von 10 Website-Nutzern — ein Nutzer belegt einen Prozess nicht während seines gesamten Besuchs, sondern nur während der Bearbeitung einer konkreten Anfrage.
So prüfst du, ob die Konfiguration geändert werden muss
Beim Shared Hosting verwaltet normalerweise der Anbieter die Einstellungen von PHP-FPM. Im Verwaltungsbereich kannst du möglicherweise nur die PHP-Version und einzelne Limits einstellen. Ob PHP-FPM verfügbar ist, welche Konfiguration möglich ist und welche Ressourcenlimits gelten, solltest du in der Dokumentation oder beim technischen Support des Hosting-Anbieters klären.
Beginne auf deinem eigenen Server mit Messungen, nicht mit dem Erhöhen der Limits. Prüfe, ob der Pool pm.max_children erreicht, wie viel Arbeitsspeicher die Prozesse unter Last verbrauchen und ob Prozessor und Datenbank noch Leistungsreserven haben. Das Protokoll für langsame Anfragen von PHP-FPM kann bei entsprechender Konfiguration helfen, Code mit langer Ausführungszeit zu finden.
Ein praktischer nächster Schritt: Wähle einen langsamen Vorgang aus, etwa das Öffnen des Warenkorbs. Stelle fest, ob die Verzögerung durch das Warten auf einen freien Prozess oder durch die Ausführung der Anwendung selbst entsteht. Erst dieses Ergebnis liefert die Grundlage dafür, die Limits von PHP-FPM zu ändern oder an Code und Datenbank zu arbeiten.
Siehe auch: Was bedeutet www?
