Was ist threadsicher oder nicht threadsicher in PHP?


773

Ich habe verschiedene Binärdateien für PHP gesehen, wie Nicht-Thread oder Thread-sicher?

Was bedeutet das?

Was ist der Unterschied zwischen diesen Paketen?


18
Sie können über roten Faden Sicherheit auf en.wikipedia.org/wiki/Thread_safety In Bezug auf PHP: PHP thread-safe Do Glaubt die Lügen nicht: PHP ist nicht Thread-sicher Noch Unterschied zwischen PHP - Thread sicher und nicht Thread - sicher binarie Es sind viele Ressourcen zur Verfügung. Suchen Sie hier bei Stackoverflow oder Google.
TigerTiger

Antworten:


668

Erforderlicher Hintergrund zu Parallelitätsansätzen:

Verschiedene Webserver implementieren unterschiedliche Techniken zur parallelen Verarbeitung eingehender HTTP-Anforderungen. Eine ziemlich beliebte Technik ist die Verwendung von Threads - das heißt, der Webserver erstellt / reserviert einen einzelnen Thread für jede eingehende Anforderung. Der Apache HTTP-Webserver unterstützt mehrere Modelle für die Verarbeitung von Anforderungen, von denen eines (als Worker-MPM bezeichnet) Threads verwendet. Es unterstützt jedoch ein anderes Parallelitätsmodell namens Prefork MPM, das Prozesse verwendet. Das heißt, der Webserver erstellt / reserviert für jede Anforderung einen einzelnen Prozess.

Es gibt auch andere völlig unterschiedliche Parallelitätsmodelle (mit asynchronen Sockets und E / A) sowie solche, die zwei oder sogar drei Modelle miteinander mischen. Um diese Frage zu beantworten, beschäftigen wir uns nur mit den beiden oben genannten Modellen und nehmen als Beispiel den Apache HTTP-Server.

Benötigter Hintergrund zur "Integration" von PHP in Webserver:

PHP selbst reagiert nicht auf die tatsächlichen HTTP-Anfragen - dies ist die Aufgabe des Webservers. Daher konfigurieren wir den Webserver so, dass Anforderungen zur Verarbeitung an PHP weitergeleitet werden. Anschließend erhalten wir das Ergebnis und senden es an den Benutzer zurück. Es gibt mehrere Möglichkeiten, den Webserver mit PHP zu verketten. Für Apache HTTP Server ist "mod_php" am beliebtesten. Dieses Modul ist eigentlich PHP selbst, wurde jedoch als Modul für den Webserver kompiliert und wird daher direkt darin geladen.

Es gibt andere Methoden zum Verketten von PHP mit Apache und anderen Webservern, aber mod_php ist die beliebteste und dient auch zur Beantwortung Ihrer Frage.

Möglicherweise mussten Sie diese Details vorher nicht verstehen, da Hosting-Unternehmen und GNU / Linux-Distributionen alles für uns vorbereitet haben.

Nun zu Ihrer Frage!

Da mit mod_php, wird PHP geladen rechts in Apache, wenn Apache Griff Gleichzeitigkeit wird seine Worker MPM verwendet (dh, Threads) , dann PHP Lage sein muss , innerhalb derselben Multi-Threaded - Umgebung zu arbeiten - das heißt, PHP muss Seien Sie threadsicher, um mit Apache richtig Ball spielen zu können!

An dieser Stelle sollten Sie denken: "OK. Wenn ich also einen Multithread-Webserver verwende und PHP direkt darin einbetten möchte, muss ich die thread-sichere Version von PHP verwenden." Und das wäre richtiges Denken. Die Thread-Sicherheit von PHP ist jedoch sehr umstritten . Es ist ein Nutzen, wenn Sie wirklich wirklich wissen, was Sie tun.

Schlussbemerkungen

Falls Sie sich fragen, wäre meine persönliche Beratung nicht in einer Multithreadumgebung PHP zu verwenden , wenn Sie haben die Wahl!

Wenn ich nur von Unix-basierten Umgebungen spreche, würde ich sagen, dass Sie glücklicherweise nur daran denken müssen, wenn Sie PHP mit Apache-Webserver verwenden möchten. In diesem Fall wird empfohlen, das Prefork-MPM von Apache (welches) zu verwenden verwendet keine Threads und daher spielt die PHP-Thread-Sicherheit keine Rolle) und alle mir bekannten GNU / Linux-Distributionen werden diese Entscheidung für Sie treffen, wenn Sie Apache + PHP über ihr Paketsystem installieren, ohne Sie dazu aufzufordern für eine Wahl. Wenn Sie andere Webserver wie nginx oder lighttpd verwenden , haben Sie ohnehin keine Möglichkeit, PHP in diese einzubetten. Sie werden versuchen, FastCGI oder etwas Ähnliches zu verwenden, das in einem anderen Modell funktioniert, in dem PHP völlig außerhalb liegtdes Webservers mit mehreren PHP-Prozessen, die zur Beantwortung von Anfragen über z. B. FastCGI verwendet werden. In solchen Fällen spielt auch die Gewindesicherheit keine Rolle. Um zu sehen, welche Version Ihre Website verwendet, legen Sie eine Datei <?php phpinfo(); ?>auf Ihrer Website ab und suchen Sie nach dem Server APIEintrag. Dies könnte so etwas wie CGI/FastCGIoder sagen Apache 2.0 Handler.

Wenn Sie sich auch die Befehlszeilenversion von PHP ansehen, spielt die Thread-Sicherheit keine Rolle.

Wenn die Thread-Sicherheit keine Rolle spielt, welche Version sollten Sie verwenden - die thread-sichere oder die nicht-thread-sichere? Ehrlich gesagt habe ich keine wissenschaftliche Antwort! Aber ich würde vermuten, dass die nicht threadsichere Version schneller und / oder weniger fehlerhaft ist, sonst hätten sie nur die threadsichere Version angeboten und sich nicht die Mühe gemacht, uns die Wahl zu geben!


2
PHP-FPM ist also kein Thread? Das löst das Problem dann, da Fast CGI auf Nginx-Servern verwendet wird.
Xeoncross

41
Tolles Detail, ich programmiere seit Jahren in PHP und wusste das nie.
Patrick

1
@Xeoncross: Im Allgemeinen ist das richtig und in der Praxis einer der Hauptgründe, PHP-Prozesse außerhalb von Apache zu verwalten. Ich gehe in meiner Antwort auf diesen Aspekt ein.
JM Becker

Das einzige Problem hierbei ist, dass PHP-FPM unter Windows nicht verfügbar ist. Zumindest als native Build.
Denis V

9
Ist die Thread-Sicherheit von PHP immer noch "umstritten" (2015 und Version 7)?
Altiano Gerung

261

Für mich wähle ich immer eine nicht threadsichere Version, weil ich immer nginx verwende oder PHP über die Befehlszeile ausführe.

Die nicht threadsichere Version sollte verwendet werden, wenn Sie PHP als CGI-Binärdatei, Befehlszeilenschnittstelle oder in einer anderen Umgebung installieren, in der nur ein einziger Thread verwendet wird.

Eine thread-sichere Version sollte verwendet werden, wenn Sie PHP als Apache-Modul in einem Worker-MPM (Multi-Processing-Modell) oder einer anderen Umgebung installieren, in der mehrere PHP-Threads gleichzeitig ausgeführt werden.


1
Greg Ihre Antwort sollte gewesen sein: "Eine Thread-sichere Version sollte verwendet werden, wenn Sie PHP als Apache-Modul installieren möchten, in dem Worker das MPM ist"
wlf

9
Also PHP, dass das Kommen mit xampp unter Windows NTS oder TS ist?
Abudayah

1
Was ist, wenn Sie einen in PHP integrierten Webserver verwenden? Welche PHP-Variante soll für eine optimale Leistung verwendet werden?
Ariod

1
@Dario Ich denke das ist nur Windows.
Greg

1
@ChristopherShaw Alter, die Antwort enthält NUR Meinung. Es gibt keine Quelle oder einen Grund, warum ZTS in Kombination mit einem Apache-Modul verwendet werden sollte. Es ist keine gültige Antwort. Sogar 217 ppl können falsch sein m8.
Daniel W.

30

Apache MPM Prefork mit Modphp wird verwendet, da es einfach zu konfigurieren / installieren ist. In Bezug auf die Leistung ist es ziemlich ineffizient. Meine bevorzugte Methode für den Stack ist FastCGI / PHP-FPM. Auf diese Weise können Sie den viel schnelleren MPM Worker verwenden. Das gesamte PHP bleibt ohne Thread, aber Apache dient als Thread (wie es sollte).

Also im Grunde von unten nach oben

Linux

Apache + MPM Worker + ModFastCGI (NICHT FCGI) | (oder) | Cherokee | (oder) | Nginx

PHP-FPM + APC

ModFCGI unterstützt PHP-FPM oder externe FastCGI-Anwendungen nicht korrekt. Es werden nur nicht prozessverwaltete FastCGI-Skripte unterstützt. PHP-FPM ist der PHP FastCGI-Prozessmanager.


21

Gemäß PHP-Dokumentation ,

Was bedeutet Thread-Sicherheit beim Herunterladen von PHP?

Thread-Sicherheit bedeutet, dass Binärdateien in einem Multithread-Webserver-Kontext wie Apache 2 unter Windows funktionieren können. Thread-Sicherheit erstellt in jedem Thread eine lokale Speicherkopie, damit die Daten nicht mit einem anderen Thread kollidieren.

Also, was wähle ich? Wenn Sie PHP als CGI-Binärdatei ausführen, benötigen Sie keine Thread-Sicherheit, da die Binärdatei bei jeder Anforderung aufgerufen wird. Für Multithread-Webserver wie IIS5 und IIS6 sollten Sie die Thread-Version von PHP verwenden.

Folgende Bibliotheken sind nicht threadsicher. Sie werden nicht für die Verwendung in einer Umgebung mit mehreren Threads empfohlen.

  • SNMP (Unix)
  • mSQL (Unix)
  • IMAP (Win / Unix)
  • Sybase-CT (Linux, libc5)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.