Shopware 6 Performance Blog
php fastcgi vs php mod php fastcgi vs php mod

PHP-FPM vs. mod_php: Beste PHP Performance für Shopware 6

Wie ein Webserver PHP-Dateien verarbeitet, hat einen maßgeblichen Einfluss auf die Performance Ihrer Anwendung. Es gibt verschiedene Ansätze, PHP mit einem Webserver zu verwenden, wobei sich die Integration auch je nach verwendetem Webserver unterscheiden kann. Besonders für Plattformen wie Shopware 6, die auf Geschwindigkeit und Skalierbarkeit angewiesen sind, stellt sich bei Apache die Frage: PHP-FPM oder mod_php?

In diesem Blogbeitrag werfen wir einen Blick auf die unterschiedlichen Möglichkeiten, wie Webserver PHP-Dateien bearbeiten können, und erklären, wie diese Integrationen funktionieren. Abschließend führen wir einen Lasttest durch, um herauszufinden, welche Lösung die beste Performance-Optimierung bietet und somit für leistungsintensive Anwendungen wie Shopware 6 am sinnvollsten ist.

mod_php: Die klassische PHP-Integration für Apache

Beginnen wir mit den Basics: mod_php ist ein Modul für den Webserver Apache, das PHP direkt in den Apache-Prozess integriert. Das bedeutet, dass für die Verarbeitung von PHP-Dateien kein separater PHP-Prozess gestartet werden muss – PHP wird direkt innerhalb des Apache-Prozesses ausgeführt. Damit stellt mod_php die grundlegende und oft standardmäßig installierte Methode dar, PHP in Verbindung mit Apache zu betreiben.

Ob mod_php verwendet wird, lässt sich leicht über die PHP-Info-Seite überprüfen: Unter dem Eintrag “Server API” wird „Apache 2.0 Handler“ angezeigt, wenn mod_php aktiv ist.

phpinfo php mod

Ein wichtiger technischer Aspekt von mod_php ist, dass es das mpm_prefork-Modul von Apache erfordert. Dieses Multi-Processing-Modul (MPM) arbeitet so, dass für jede Anfrage ein eigener Prozess erstellt wird.

Wenn ihr nicht wisst, was ein MPM ist, schaut gerne in einem meiner letzten Beiträge vorbei: Apache vs. Nginx – Welcher Webserver bringt mehr Speed?

Falls mod_php bei Euch nicht standardmäßig installiert ist, muss möglicherweise das passende PHP-Modul für Eure PHP-Version manuell nachgerüstet werden. In meiner Umgebung war es jedoch direkt einsatzbereit, was mod_php zu einer der einfachsten Lösungen für die PHP-Integration mit Apache macht.

Wann ist mod_php sinnvoll?

mod_php überzeugt vor allem durch seine Einfachheit und die nahtlose Integration in Apache. Es ist eine ausgezeichnete Wahl für Einsteiger, kleine Projekte oder Legacy-Systeme, bei denen Performance und Skalierbarkeit nicht die oberste Priorität sind. Für moderne und hochskalierbare Anwendungen gibt es jedoch leistungsfähigere Alternativen wie PHP-FPM.

PHP-FastCGI und PHP-FPM: Die moderne Integration von PHP

PHP-FastCGI bzw. PHP-FPM sind fortschrittliche Ansätze, um PHP effizient und performant in modernen Webserver-Umgebungen zu integrieren. Während FastCGI die Grundlage für eine optimierte Verarbeitung von Anfragen bildet, stellt PHP-FPM die bevorzugte Implementierung dar, die speziell für leistungsstarke und skalierbare Anwendungen entwickelt wurde.

Was ist CGI und warum ist es veraltet?

Bevor wir in die Details von FastCGI und PHP-FPM eintauchen, werfen wir einen Blick auf CGI (Common Gateway Interface). CGI war eine der ersten Methoden, um dynamische Inhalte auf Webservern bereitzustellen. Bei jeder Anfrage startete der Webserver einen neuen Prozess, der die Anfrage bearbeitete und das Ergebnis zurückgab.

Dieser Ansatz ist jedoch äußerst ressourcenintensiv und ineffizient, da ständig neue Prozesse erstellt und wieder beendet werden. CGI wurde daher durch modernere Protokolle wie FastCGI ersetzt, die auf Wiederverwendbarkeit setzen.

FastCGI: Die Evolution von CGI

FastCGI ist eine Weiterentwicklung des CGI-Protokolls und wurde entwickelt, um die Schwächen seines Vorgängers zu beheben. Im Gegensatz zu CGI nutzt FastCGI langlebige Prozesse, die mehrfach wiederverwendet werden können.

Die Vorteile von FastCGI:

  • Ressourcenschonend: Prozesse werden nicht für jede Anfrage neu gestartet.
  • Geringere Latenzzeit: Da Prozesse bereits laufen, wird die Bearbeitungszeit pro Anfrage reduziert.
  • Flexibilität: FastCGI fungiert als Schnittstelle zwischen dem Webserver (z. B. Nginx oder Apache) und dem PHP-Interpreter und ermöglicht so eine saubere Trennung.

FastCGI bildet die Basis für PHP-FPM.

PHP-FPM: Die bevorzugte FastCGI-Implementierung für PHP

PHP-FPM (PHP FastCGI Process Manager) ist eine optimierte Implementierung des FastCGI-Protokolls, die speziell für PHP entwickelt wurde. Es ist die bevorzugte Wahl in modernen Umgebungen wie Nginx oder auch bei Apache (in Kombination mit dem MPM Event-Modul).

Wie funktioniert PHP-FPM?

  1. Der Webserver (z. B. Nginx oder Apache) empfängt eine HTTP-Anfrage.
  2. Die Anfrage wird über das FastCGI-Protokoll an PHP-FPM weitergeleitet.
  3. PHP-FPM verarbeitet die Anfrage, indem es ein vorkonfiguriertes PHP-Skript ausführt.
  4. Das Ergebnis (z. B. HTML) wird an den Webserver zurückgegeben und an den Client ausgeliefert.

PHP-FPM verwaltet die PHP-Prozesse effizienter als ältere Methoden wie mod_php oder die rudimentäre FastCGI-Integration.

Installation von PHP-FPM und Wechsel von mod_php

Wenn Du PHP-FPM nutzen möchtest, musst Du sicherstellen, dass Dein Webserver entsprechend konfiguriert ist. Ein typisches Setup erfordert:

  • Den Wechsel des Apache MPM-Moduls von prefork (benötigt für mod_php) zu event.
  • Die Installation und Aktivierung von PHP-FPM und den dazugehörigen fcgi-Paketen.

Eine detaillierte Anleitung findest Du beispielsweise in diesem DigitalOcean-Tutorial. Dort wird erklärt, wie Du die MPM-Konfiguration änderst, PHP-FPM installierst und die beiden Module erfolgreich einrichtest.

In der phpinfo() solltest Du mit PHP-FPM unter “Server API” den Wert “FPM/FastCGI” sehen:

phpinfo fastcgi performance

Performance-Test: PHP-FPM vs. mod_php

Um die Performance von PHP-FPM und mod_php zu vergleichen, habe ich einen Lasttest auf meinem Shop shop.pagespeedy.de durchgeführt. Dabei handelt es sich um einen frischen Shopware 6.6 Shop mit nahezu Standard-Einstellungen, einigen kleineren Optimierungen und Testprodukten, die mithilfe eines Tools generiert wurden. Der Shop läuft auf einem Hetzner LAMP-Stack mit 2 CPU-Kernen und 8 GB RAM.

Test-Setup und Durchführung

Der Lasttest wurde mit meinem eigenen Tool durchgeführt, das auf Locust basiert. Details zu diesem Tool und seiner Funktionsweise findest Du in meinen Blogbeiträgen:

Test-Szenario

Ich habe einen Integrationstest durchgeführt, bei dem verschiedene Bereiche des Shops gleichzeitig getestet wurden. Die Nutzer wurden auf folgende Aktionen verteilt:

  1. API-Requests (z. B. Preis- und Bestandsupdates).
  2. Besucher, die im Shop surfen.
  3. Besucher, die sich registrieren und einkaufen.
  4. Besucher, die ohne surfen direkt kaufen.

Die Tests liefen jeweils über 5 Minuten und wurden mehrfach durchgeführt, um konsistente Ergebnisse zu erhalten.

Ergebnisse bei unterschiedlicher Nutzerzahl

10 User

mod_phpPHP-FPM
Load Average1,370,5
Anfragen insgesamt14301449
Durchschnittliche Ladezeit170ms171ms
Requests pro Sekunde4,34,5

40 User

mod_phpPHP-FPM
Load Average5,43,7
Anfragen insgesamt49845121
Durchschnittliche Ladezeit406ms335ms
Requests pro Sekunde17,418.1

Erkenntnisse aus dem Lasttest

Auch wenn die Unterschiede zwischen PHP-FPM und mod_php auf den ersten Blick nicht riesig erscheinen, gibt es klare Vorteile für PHP-FPM:

  1. Geringere Systemauslastung: PHP-FPM erzeugt eine messbar niedrigere CPU-Last, wodurch der Shop unter hoher Auslastung stabiler läuft und mehr Traffic bewältigen kann.
  2. Bessere Performance bei hoher Last: Die Anzahl der verarbeiteten Requests und die durchschnittlichen Ladezeiten sind bei PHP-FPM leicht besser.

Fazit

PHP-FPM ist die bessere Wahl für Shops, die mit moderatem bis hohem Traffic rechnen. Es bietet eine stabilere Performance und eine effizientere Ressourcennutzung, besonders unter hoher Last. Für kleinere Setups oder Testumgebungen mag mod_php ausreichend sein, aber für produktive Shops wie Shopware 6 ist PHP-FPM klar zu empfehlen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert