2015-05-28 2 views
6

mit der Prozesskomponente von SF2, es ist möglich, asynchrone Hintergrundaufgaben von einem Controller zu starten.Ausführen von Symfony2 Command im Hintergrund und Abfrage der Ausgabe über Ajax

Was ich jetzt tun möchte, ist ein Javascript zu schreiben, das regelmäßig nach diesem Befehl sucht und die Ausgabe dieser Aufgabe abruft, um den Benutzer darüber zu informieren, was passiert.

Gibt es eine Möglichkeit, den Prozess zu speichern und Informationen über mehrere Anfragen abzurufen, so dass ich ihn über eine Ajax-Anfrage abfragen kann?

+3

Ich denke, Sie wären besser dran, den Befehl zu haben, seine Fortschrittsupdates irgendwohin zu schieben und dann Ihren Ajax-Aufruf dagegen vergleichen zu lassen. –

+0

Das interessiert mich auch. Die Probleme, auf die ich gestoßen bin, sind, sobald Sie Ihren Ajax-Aufruf starten, dass der Prozess auf eine Antwort wartet, aber Sie können keine Antwort von Ihrem Befehl zurückgeben, da dies Ihr Skript beenden wird. Entweder muss Ihr Befehl seinen Fortschritt irgendwohin verschieben (nicht sicher, wo), wie @DerickF gesagt hat, oder Ihr Befehl muss einen anderen Hintergrundprozess aufrufen, der irgendwo noch Updates pushen muss. Geben Sie diese beiden Szenarien an. Ich denke, am einfachsten wäre es, irgendwo diese Updates in Ihrem ursprünglichen Befehl zu finden. –

+0

Weiter zu meinem ersten Kommentar, wenn Sie Updates auf die Datenbank schieben, erhalten Sie einen Leistungseinbruch, weil Sie anstatt mit einer großen Transaktion alles mit kleineren Transaktionen fortführen und Ihr Skript länger läuft. Einige der wichtigsten Dinge, die Sie herausfinden müssen, sind: Wo drücken Sie diese Updates und wie werden sie abgefragt? –

Antwort

0

Ich benutze die JMSJobQueueBundle (Github, docs), um Hintergrundprozesse zu erstellen und die Warteschlange (mit Metadaten) in einer Datenbank zu speichern.

Nach diesem Bündel installieren, Sie bestehen nur einen Job in Ihrer Datenbank mit dem Befehl (und optionalen Argumenten und Optionen):

$job = new Job('my-symfony2:command', array('some-args', 'or', '--options="foo"')); 
$em->persist($job); 
$em->flush($job); 

Das Bündel übernimmt diesen Befehl auszuführen (nach supervisord oder einer Einrichtung Cron-Job) und speichert die Ausgabe Ihres Befehls in der Datenbank. Wenn Ihr Job fehlschlägt, speichert er sogar den Stack-Trace in der Datenbank. Jetzt können Sie den Status eines Jobs in Ihrer Anwendung erhalten (Sie können $job->getState() verwenden, um zu sehen, ob es fertig ist oder nicht). Sie können die Job-Entität here finden, um zu sehen, was standardmäßig in der Datenbank gespeichert ist.

Ich habe diese Methode beim Senden vieler E-Mails oder beim Erstellen großer CSV-Exporte verwendet und es funktioniert perfekt.