Gibt es eine realistische Möglichkeit, ein Multithread-Modell in PHP wirklich zu implementieren oder nur zu simulieren? Vor einiger Zeit wurde vorgeschlagen, das Betriebssystem zu zwingen, eine andere Instanz der ausführbaren PHP-Datei zu laden und andere gleichzeitige Prozesse zu verarbeiten.
Das Problem dabei ist, dass die PHP-Instanz nach Abschluss der Ausführung des PHP-Codes im Speicher verbleibt, da es keine Möglichkeit gibt, sie innerhalb von PHP zu beenden. Wenn Sie also mehrere Threads simulieren, können Sie sich vorstellen, was passieren wird. Daher suche ich immer noch nach einer Möglichkeit, wie Multithreading in PHP effektiv durchgeführt oder simuliert werden kann. Irgendwelche Ideen?
php
multithreading
Steve Obbayi
quelle
quelle
Antworten:
Multithreading ist in PHP möglich
Ja, Sie können Multithreading in PHP mit Pthreads durchführen
Aus der PHP-Dokumentation :
Einfacher Test
Erster Lauf
Zweiter Lauf
Beispiel aus der realen Welt
quelle
Warum benutzt du nicht Popen ?
quelle
Threading ist in Standard-PHP nicht verfügbar, aber die gleichzeitige Programmierung ist möglich, indem HTTP-Anforderungen als asynchrone Aufrufe verwendet werden.
Wenn die Zeitlimiteinstellung der Locke auf 1 gesetzt ist und dieselbe Sitzungs-ID für die Prozesse verwendet wird, die Sie miteinander verknüpfen möchten, können Sie mit Sitzungsvariablen wie in meinem Beispiel unten kommunizieren. Mit dieser Methode können Sie sogar Ihren Browser schließen und der gleichzeitige Prozess ist noch auf dem Server vorhanden.
Vergessen Sie nicht, die richtige Sitzungs-ID wie folgt zu überprüfen:
startprocess.php
process1.php
verifysession.php
closeprocess.php
quelle
set_time_limit(0);
Huch! Mach das niemals.Während Sie nicht fädeln können, haben Sie ein gewisses Maß an Prozesskontrolle in PHP. Die beiden hier nützlichen Funktionssätze sind:
Prozesssteuerungsfunktionen http://www.php.net/manual/en/ref.pcntl.php
POSIX-Funktionen http://www.php.net/manual/en/ref.posix.php
Sie können Ihren Prozess mit pcntl_fork verzweigen und die PID des Kindes zurückgeben. Dann können Sie posix_kill verwenden, um diese PID zu entsorgen.
Das heißt, wenn Sie einen übergeordneten Prozess beenden, sollte ein Signal an den untergeordneten Prozess gesendet werden, das ihn zum Sterben auffordert. Wenn PHP dies nicht erkennt, können Sie eine Funktion registrieren, um es zu verwalten und einen sauberen Exit mit pcntl_signal durchzuführen.
quelle
Die Verwendung von Threads wird durch die PECL-Erweiterung pthreads ermöglicht
http://www.php.net/manual/en/book.pthreads.php
quelle
Ich weiß, dass dies eine alte Frage ist, aber für Leute, die suchen, gibt es eine in C geschriebene PECL-Erweiterung, die jetzt PHP-Multithreading-Funktionen bietet. Sie befindet sich hier https://github.com/krakjoe/pthreads
quelle
Sie können exec () verwenden, um ein Befehlszeilenskript (z. B. Befehlszeilen-PHP) auszuführen. Wenn Sie die Ausgabe an eine Datei weiterleiten, wartet Ihr Skript nicht auf den Abschluss des Befehls.
Ich kann mich nicht ganz an die PHP-CLI-Syntax erinnern, aber Sie möchten etwas wie:
Ich denke, einige Shared Hosting Server haben exec () aus Sicherheitsgründen standardmäßig deaktiviert, aber es könnte einen Versuch wert sein.
quelle
Sie könnten das Einfädeln simulieren. PHP kann Hintergrundprozesse über popen (oder proc_open) ausführen. Diese Prozesse können über stdin und stdout kommuniziert werden. Natürlich können diese Prozesse selbst ein PHP-Programm sein. Das ist wahrscheinlich so nah wie möglich.
quelle
Je nachdem, was Sie versuchen, können Sie auch curl_multi verwenden, um dies zu erreichen.
quelle
Ich weiß, dass dies viel alt ist, aber Sie können sich http://phpthreadlib.sourceforge.net/ ansehen.
Es unterstützt die bidirektionale Kommunikation zwischen Threads und verfügt über integrierte Schutzfunktionen zum Abtöten von untergeordneten Threads (Verhinderung von Waisen).
quelle
Sie haben die Wahl zwischen:
quelle
Die Thread-Klasse ist verfügbar, da PECL-Pthreads ≥ 2.0.0 sind.
quelle
Wie wäre es mit pcntl_fork?
Beispiele finden Sie auf der Handbuchseite: PHP pcntl_fork
quelle
pcntl_fork
funktioniert in einer Webserverumgebung nicht, wenn der abgesicherte Modus aktiviert ist. In diesem Fall funktioniert es nur in der CLI-Version von PHP.quelle
Wenn Sie einen Linux-Server verwenden, können Sie verwenden
Wenn Sie einige Argumente übergeben müssen
In script.php
Oder verwenden Sie Symfony https://symfony.com/doc/current/components/process.html
quelle
Zum Zeitpunkt des Schreibens meines aktuellen Kommentars weiß ich nichts über die PHP-Threads. Ich habe hier selbst nach der Antwort gesucht, aber eine Problemumgehung besteht darin, dass das PHP-Programm, das die Anforderung vom Webserver empfängt, die gesamte Antwortformulierung an eine Konsolenanwendung delegiert, die ihre Ausgabe, die Antwort auf die Anforderung, in einer Binärdatei speichert und das PHP-Programm, das die Konsolenanwendung gestartet hat, gibt diese Binärdatei Byte für Byte als Antwort auf die empfangene Anforderung zurück. Die Konsolenanwendung kann in jeder Programmiersprache geschrieben werden, die auf dem Server ausgeführt wird, einschließlich solcher, die eine ordnungsgemäße Threading-Unterstützung bieten, einschließlich C ++ - Programmen, die OpenMP verwenden.
Ein unzuverlässiger, schmutziger Trick besteht darin, PHP zum Ausführen einer Konsolenanwendung zu verwenden.
und drucken Sie die Ausgabe dieses Konsolenbefehls in die HTML-Ausgabe, um die genaue Version der Serversoftware zu ermitteln. Installieren Sie dann genau dieselbe Version der Software auf einer VirtualBox-Instanz, kompilieren / montieren Sie alle vollständig eigenständigen, vorzugsweise statischen Binärdateien, die Sie möchten, und laden Sie diese dann auf den Server hoch. Ab diesem Zeitpunkt kann die PHP-Anwendung diese Binärdateien in der Rolle der Konsolenanwendung verwenden, die über ein ordnungsgemäßes Multithreading verfügt. Es ist eine schmutzige, unzuverlässige Problemumgehung für eine Situation, in der der Serveradministrator nicht alle erforderlichen Programmiersprachenimplementierungen auf dem Server installiert hat. Achten Sie darauf, dass bei jeder Anforderung, dass die PHP-Anwendung die Konsolenanwendung (en) empfängt, / exit / get_killed beendet wird.
Was die Hosting-Service-Administratoren von solchen Servernutzungsmustern halten, hängt wohl von der Kultur ab. In Nordeuropa MUSS der Dienstanbieter LIEFERN, WAS ANGEZEIGT WURDE und ob die Ausführung von Konsolenbefehlen und das Hochladen von Nicht-Malware-Dateien zulässig war und der Dienstanbieter das Recht hat, jeden Serverprozess nach einigen Minuten oder sogar nach 30 Sekunden abzubrechen Dann fehlen den Hosting-Service-Administratoren Argumente für eine ordnungsgemäße Beschwerde. In den USA und Westeuropa ist die Situation / Kultur sehr unterschiedlich, und ich glaube, dass es eine große Chance gibt, dass sich der Hosting-Dienstleister in den USA und / oder Westeuropa weigert, Hosting-Service-Kunden zu bedienen, die den oben beschriebenen Trick anwenden. Das ist nur meine Vermutung angesichts meiner persönlichen Erfahrung mit den USA Hosting-Dienste und gegeben, was ich von anderen über westeuropäische Hosting-Dienste gehört habe. Zum Zeitpunkt des Schreibens meines aktuellen Kommentars (2018_09_01) weiß ich nichts über die kulturellen Normen der südeuropäischen Hosting-Dienstleister, südeuropäischen Netzwerkadministratoren.
quelle
Vielleicht habe ich etwas verpasst, aber exec hat in der Windows-Umgebung, die ich in Windows verwendet habe, nicht so asynchron für mich funktioniert und es hat wie ein Zauber funktioniert;)
quelle
Multithreading bedeutet, mehrere Aufgaben oder Prozesse gleichzeitig auszuführen. Wir können dies in PHP erreichen, indem wir folgenden Code verwenden. Es gibt zwar keinen direkten Weg, um Multithreading in PHP zu erreichen, aber wir können fast dieselben Ergebnisse erzielen, indem wir den folgenden Weg gehen.
}}
Test_1.php
Dadurch wird test_1.php zweimal gleichzeitig ausgeführt und beide Prozesse werden gleichzeitig im Hintergrund ausgeführt. Auf diese Weise können Sie Multithreading in PHP erreichen.
Dieser Typ hat wirklich gute Arbeit geleistet Multithreading in PHP
quelle