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?
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?
Antworten:
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.
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.
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.
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 API
Eintrag. Dies könnte so etwas wie CGI/FastCGI
oder 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!
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.
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.
Gemäß PHP-Dokumentation ,
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.