Thread Safe und Non-Thread Safe in PHP: Was wählen und wie man keinen Fehler macht?

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Was ist Thread Safe oder Non-Thread Safe in PHP? Wir klären es ein für alle Mal

\n\n

Wenn 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\n

Dieser 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\n

Kurz und knapp: Was ist Threadsicherheit?

\n\n

Stellen 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\n

Im 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\n

Einfach 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\n

Wann und warum sind TS- und NTS-Versionen entstanden?

\n\n

Historisch 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\n

Spä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\n

Wie erkennt man, welche PHP-Version installiert ist?

\n\n

Der einfachste Weg ist, in der Konsole oder in einem PHP-Skript auszuführen:

\n\n
<?php\nphpinfo();\n?>
\n\n

Suchen Sie nach der Zeile Thread Safety. Wenn dort enabled steht, haben Sie eine TS-Version. Wenn disabled – eine NTS-Version.

\n\n

Die zweite Möglichkeit ist, die Ausgabe des Befehls php -i | findstr "Thread" (Windows) oder php -i | grep Thread (Linux/macOS) zu betrachten.

\n\n

Optische Unterschiede in den Distributionsnamen

\n\n

Auf 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 -ts angegeben
  • \n
\n\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\n

Praktische Szenarien: Wann TS und wann NTS wählen?

\n\n

Szenario 1: Apache + mod_php (worker MPM)

\n\n

Wenn 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

Blogs

Buchempfehlungen