Ich versuche gerade, eine Multi-Thread-PHP-Anwendung zu erstellen. Ich habe viel Papier gelesen, in dem erklärt wird, wie man Multithreading erstellt. Alle diese Beispiele bauen darauf auf, die Prozesse auf verschiedenen PHP-Arbeitsdateien abzulegen. Genau das versuche ich auch, aber es gibt ein Problem:)
Es gibt zu viele Jobs, um sich zu teilen in 30 Sekunden (was das Ausführungszeitlimit ist)
Wir verwenden eine Multi-Server-Umgebung im lokalen Netzwerk, um die Prozesse abzuschließen, da die Prozesse nicht miteinander verknüpft sind oder denselben Speicher teilen. Wir müssen sie nur anwerfen und sie zu einer bestimmten Zeit arbeiten lassen. Jeder der Prozesse funktioniert für 0,5 Sekunden, aber es hat eine Möglichkeit, für 30 Sekunden zu arbeiten.
Die meisten Beispiele feuern die PHP's und warten auf die Ergebnisse. Aber leider muss ich in meiner Situation kein Ergebnis vom Thread erwarten. Ich brauche es nur, um den Befehl auszuführen und das Ergebnis in eine eigene Datenbank zu schreiben.
Wie kann ich erreichen, dass PHPs gestartet werden und darauf warten, dass sie für 10000 Prozesse funktionieren?
ZUSÄTZLICHE INFORMATIONEN: Ich weiß, dass PHP weder eine Multi-Threading-Funktion besitzt noch dafür gebaut ist. Aber wir müssen einen Weg schaffen, um es zu benutzen, zum Beispiel können wir eine Anfrage an Ссылка senden, aber Standartmethoden lassen uns auf das warten Ergebnis. Wenn wir es schaffen, eine Anfrage an diesen Server zu senden, ohne auf das Ergebnis zu warten, würde dies unser Problem lösen, denke ich, oder wir werden einen völlig anderen Ansatz wie einen Prozessteiler mit c ++ oder qt brauchen.
Wie bereits erwähnt, unterstützt PHP nicht Multi-Threading. Wie Tomaszsobczak bereits erwähnt hat, gibt es jedoch eine Bibliothek, mit der Sie "Threads" erstellen und sie laufen lassen können. Sie können sich dann mit anderen Skripten verbinden, um deren Status zu überprüfen, zB " Gearman ".
Von der Projekthomepage: "Gearman stellt ein generisches Anwendungsframework zur Verfügung, um die Arbeit an anderen Maschinen oder Prozessen durchzuführen, die besser für die Arbeit geeignet sind. Sie können parallel arbeiten, um die Balance-Verarbeitung zu laden. und um Funktionen zwischen Sprachen aufzurufen. Es kann in einer Vielzahl von Anwendungen verwendet werden, von hochverfügbaren Websites bis zum Transport von Datenbankreplikationsereignissen, mit anderen Worten, es ist das Nervensystem für die Kommunikation zwischen verteilter Verarbeitung. "
Rasmus Blog hat eine tolle Geschichte darüber: spielen mit gearman und für Ihren Fall könnte es nur die Lösung sein, obwohl ich ' Ich habe keine eingehenden Testfälle gelesen ... Wäre aber interessant zu wissen, also wenn du das am Ende verwendest, bitte melde dich zurück!
Wie die Kommentare sagen, ist Multi-Threading in PHP nicht möglich. Aber basierend auf Ihrem Kommentar:
Wenn wir es schaffen, eine Anfrage an diesen Server zu senden, ohne auf das Ergebnis zu warten, würde das unser Problem lösen, denke ich
Sie können ein PHP-Skript starten, das im Hintergrund mit exec () , um die Ausgabe des Skripts anderswo weiterzuleiten (zB /dev/null
). Ich denke, das ist das Beste, was du bekommst. Aus dem Handbuch:
Hinweis: Wenn ein Programm mit dieser Funktion gestartet wird, muss die Ausgabe des Programms in eine Datei oder einen anderen Ausgabestrom umgeleitet werden, damit es im Hintergrund weiterläuft. Andernfalls wird PHP hängen bleiben, bis die Ausführung des Programms beendet wird.
In den Kommentaren für Benutzer gibt es mehrere Hinweise und Hinweise, beispielsweise dieses Snippet , das die Ausführung im Hintergrund sowohl auf Windows- als auch auf Linux-Plattformen ermöglicht.
Natürlich teilt dieses PHP-Skript nicht den Status oder irgendwelche Daten des von Ihnen ausgeführten PHP-Skripts. Sie müssen das Hintergrundskript so initialisieren, als würden Sie eine komplett neue Anfrage machen.
Da PHP nicht in der Lage ist, Multithreading zu unterstützen, weiß ich nicht genau, wie ich Sie beraten soll. Jedes Mal, wenn ein neues Skript geladen wird, wird eine neue PHP-Instanz geladen. Wenn Ihr Server also viele PHP-Instanzen verarbeiten kann, können Sie tun, was Sie wollen.
Hier ist jedoch etwas:
Gefunden bei Ссылка
Wie bereits erwähnt, unterstützt PHP nativ kein Multithreading und die Problemumgehungen sind, gut, Workarounds ...
Haben Sie schon einmal von dem Facebook PHP Compiler gehört? Im Grunde kompiliert es Ihr PHP zu hoch optimiertem C ++ und verwendet g ++, um es zu kompilieren. Dies eröffnet eine Welt von Möglichkeiten, einschließlich, aber nicht beschränkt auf Multithreading!
Das Projekt ist Open-Source und es ist auf github
Tags und Links multithreading php apache