2012-04-26 14 views
9

Ich bin an einem Punkt in meiner PHP-serverseitigen API, wo ich viele MySQL-Abfragen mache, und ich möchte es beschleunigen, indem mehrere Threads auf verschiedene Abfragen arbeiten und dann die Ergebnisse zurückgeben.Nebenläufigkeit in PHP

Aber wie mache ich einen anderen Thread in PHP? Ich verfahre POST-Parameter, so dass eine einfache shell_exec() könnte funktionieren, scheint aber irgendwie unsicher. Optionen Ich erwäge:

1) Erstellen Sie eine cURL Anfrage mit den Parametern Ich habe, verarbeiten die JSON aus der Anforderung und dann zurück

2) eine shell_exec() mit PHP CLI aufrufen und irgendwie (wie würde ich tun dies ??) verarbeiten Sie die Antwort in PHP

Was sind die besten Optionen hier?

+0

Normalerweise ist es mit Warteschlange und Worker, die es überwacht – zerkms

+0

getan, wie ist das getan? – lollercoaster

+0

Richten Sie eine Software zur Verwaltung von Warteschlangen ein (z. B. rabbitmq). Dann fügt Ihr Skript eine Aufgabe zur Warteschlange hinzu und ein Hintergrundarbeiter führt sie aus. – zerkms

Antwort

4

In PHP gibt es keine Threading-Unterstützung. Sie können jedoch die Erweiterung pcntl verwenden, um Gabeln zu spawnen und zu verwalten, aber es wäre am besten, einen zweiten Blick auf Ihre Algorithmen zu werfen, wenn Sie zu der Schlussfolgerung kamen, dass Dinge mit Threading erledigt werden sollten.

Eine Option für die asynchrone Verarbeitung von Operationen mit langer Laufzeit wäre, sie in einer Datenbank zu speichern und von einem Hintergrund-Worker-Prozess aus der Datenbank zu übernehmen, die Ergebnisse zu berechnen und die Ergebnisse in der Datenbank zu speichern. Dann würde das nach vorne zeigende Skript sie in der Datenbank nachsehen, um zu sehen, ob sie abgeschlossen sind und was das Ergebnis ist.

+1

Wie werden große Websites in PHP gebaut, wenn das der Fall ist? – lollercoaster

+1

@lollercoaster: Wie "groß" ist mit Threads verwandt? – zerkms

+1

es scheint mir, dass Performance-kritische APIs/Sites mit vielen Datenbankinteraktionen Parallelität benötigen – lollercoaster

3

Überprüfen Sie die pcntl extension. PHP unterstützt überhaupt kein TrueThreading, also müssen Sie Pseudo-Threads durch fork() ing implementieren. Beachten Sie, dass das Forken() eines Prozesses viel "schwerer" ist als das Erzeugen eines Threads.

2

PHP hat keine Threads implementiert (und wird es wahrscheinlich auch nie tun), weil viele PHP-Bibliotheken NICHT Thread-sicher sind. Diese Alternative ist pcntl, die die C fork Funktion umschließt.

Ich habe created a handy wrapper für diese Funktionen, die mich auf einer höheren Ebene verwalten können.

$thread1 = new Thread(function($thread) { 
    sleep(4); 
    $thread->write("Hello\n"); 
}); 

$thread2 = new Thread(function($thread) { 
    sleep(5); 
    $thread->write("World\n"); 
}); 

$thread3 = new Thread(function($thread) { 
    sleep(6); 
}); 

print $thread1->read(); // time: 0 -> 4 
print $thread2->read(); // time: 4 -> 5 
$thread3->join(); // time 5 -> 6 

// More advanced handling: 
// Thread::selectUntilJoin(array($thread1, $thread2, $thread3), function() { ... }, function() { ... }); 
+0

"bedeutet, dass die Funktionen nicht aus verschiedenen Threads aufgerufen werden können" --- es ist keine korrekte Definition für TS-Code – zerkms