Multithreading in PHP

8

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.

    
Harun Baris Bulut 24.02.2010, 11:49
quelle

7 Antworten

6

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!

    
dmp 24.02.2010, 12:32
quelle
5

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.

    
Pekka 웃 24.02.2010 12:17
quelle
3

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:

Code für die Ausführung im Hintergrund

%Vor%

Gefunden bei Ссылка

    
Layke 24.02.2010 12:17
quelle
2

Wollen Sie wirklich Multithreading in PHP haben?

ODER willst du nur ein PHP-Skript pro Sekunde ausführen? Für den letzteren Fall sollte ein Cronjob-ähnliches "Ausführen dieser Datei jede Sekunde" -Ansatz über Linux-Konsolen-Tools ausreichen.

    
Karsten 24.02.2010 12:17
quelle
1

Wenn Ihre Aufgabe darin besteht, viele HTTP-Anfragen zu stellen, können Sie curl multi verwenden. Es gibt eine gute Bibliothek dafür: Ссылка

    
Sam Dark 24.02.2010 12:21
quelle
1

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

    
Alex Weber 24.02.2010 12:23
quelle
1

Wenn Sie nur eine HTTP-Anfrage senden möchten, tun Sie es einfach mit PHP CURL lib. Es wird Ihr Problem lösen.

    
coder 24.02.2010 12:25
quelle

Tags und Links