Was ist Thread Safe oder Non-Thread Safe in PHP? Wir klären es ein für alle Mal
\n\nWenn Sie jemals PHP unter Windows installiert oder einen Webserver konfiguriert haben, sind Ihnen in den Distributionsnamen sicherlich die mysteriösen Abkürzungen TS und NTS begegnet. Oder Sie haben in der Dokumentation Warnungen gelesen: „Wählen Sie die Thread-Safe- oder Non-Thread-Safe-Version“. Und sofort tauchte die Frage auf: „Was bedeutet das überhaupt? Und was passiert, wenn ich die falsche wähle?“
\n\nDieser Artikel ist Ihr Navigator in der Welt der PHP-Threadsicherheit. Wir klären, wie sich Thread Safe (TS) und Non-Thread Safe (NTS) Builds unterscheiden, wann welcher benötigt wird und wie Sie nicht in die Falle der Inkompatibilität von Erweiterungen tappen. Los geht's!
\n\nKurz und knapp: Was ist Threadsicherheit?
\n\nStellen Sie sich vor, PHP ist ein Koch in der Küche. Und jede Anfrage an Ihre Website ist eine neue Bestellung. Im Non-Thread Safe-Modus bereitet jeder Koch seine Bestellung in einer eigenen, persönlichen Küche zu. Sie stören sich nicht gegenseitig, weil jeder seine eigenen Messer, Töpfe und Zutaten hat. Kein gemeinsamer Speicher – keine Konflikte.
\n\nIm Thread Safe-Modus haben Sie einen Koch, aber er arbeitet mit mehreren Händen (Threads). Alle Hände teilen sich eine Küche, dieselben Werkzeuge und denselben Speicher. Dabei ist es entscheidend, nicht gleichzeitig dasselbe Messer zu greifen. Um dies zu verhindern, sind Sperren und Synchronisation erforderlich – das ist Threadsicherheit (Thread Safety).
\n\nEinfach ausgedrückt: Thread Safe (TS) – PHP kann in einer Multithread-Umgebung arbeiten, in der ein Prozess mehrere Anfragen gleichzeitig verarbeitet. Non-Thread Safe (NTS) – PHP arbeitet im Singlethread-Modus, bei dem jede Anfrage ein separater Prozess ist.
\n\nWann und warum sind TS- und NTS-Versionen entstanden?
\n\nHistorisch gesehen hat sich PHP als Modul für Apache (mod_php) entwickelt. Apache kann in zwei Modi arbeiten: prefork (ein Prozess pro Anfrage) und worker (ein Prozess mit vielen Threads). Für prefork ist Threadsicherheit nicht erforderlich – jede Anfrage ist isoliert. Für worker ist sie jedoch kritisch.
\n\nSpäter, mit der wachsenden Popularität von FastCGI (PHP-FPM) und Nginx, wurde klar: In diesen Szenarien wird Multithreading innerhalb von PHP nicht genutzt. FastCGI startet separate Prozesse, und jeder arbeitet unabhängig. Warum also den schwerfälligen Code für Sperren mit sich herumtragen? So entstanden die schlankeren Non-Thread Safe-Builds.
\n\nWie erkennt man, welche PHP-Version installiert ist?
\n\nDer einfachste Weg ist, in der Konsole oder in einem PHP-Skript auszuführen:
\n\n<?php\nphpinfo();\n?>\n\nSuchen Sie nach der Zeile Thread Safety. Wenn dort enabled steht, haben Sie eine TS-Version. Wenn disabled – eine NTS-Version.
\n\nDie zweite Möglichkeit ist, die Ausgabe des Befehls php -i | findstr "Thread" (Windows) oder php -i | grep Thread (Linux/macOS) zu betrachten.
Optische Unterschiede in den Distributionsnamen
\n\nAuf der offiziellen Website windows.php.net sehen Sie etwa folgende Namen:
\n\n- \n
- php-8.3.0-Win32-vs16-x64.zip – normalerweise ist dies NTS (aber die Beschreibung sollte überprüft werden) \n
- php-8.3.0-Win32-vs16-x64-ts.zip – dies ist die TS-Version, hier ist explizit
-tsangegeben \n
Unter Linux werden Builds normalerweise nicht getrennt – dort wird ein einzelnes Binärprogramm verwendet, das mit Thread-Unterstützung (ZTS – Zend Thread Safety) kompiliert wurde, aber Multithreading wird nur bei Verwendung von Apache worker tatsächlich aktiviert.
\n\nPraktische Szenarien: Wann TS und wann NTS wählen?
\n\nSzenario 1: Apache + mod_php (worker MPM)
\n\nWenn Sie Apache mit worker oder event MPM (Multithread-Modi) verwenden, benötigen Sie zwingend die TS-Version von PHP. Andernfalls drohen fatale Fehler, Serverabstürze und Datenverlust. Das würde ungefähr so aussehen