Was ist der richtige Weg, um Symfony Aufgaben in einem separaten Prozess auszuführen. Meine erste Vermutung wäre, fork/exec zu verwenden, aber laut こん Sie können es nicht mit etwas tun, das Dateideskriptoren oder Verbindungen offen hält (wie MySQL). Das klingt also nicht so, als wäre es eine Option. Eine andere Alternative ist, Folgendes zu tun exec('symfony taskname &')
aber das scheint mir ein Hack zu sein. Ist das das Beste, was ich tun kann? Gibt es einen dritten Weg?
Antworten
Zu viele Anzeigen?In der Regel wird dies mit Hilfe einer Aufgabenwarteschlange gehandhabt. Wenn Sie einen Hintergrundprozess ausführen wollen, fügen Sie ihn zu einer Warteschlange hinzu (Sie könnten Ihre Datenbank verwenden oder einen Warteschlangen-Daemon wie beanstalkd). Sie haben dann einige daemonisierte Prozesse, deren Aufgabe es ist, Arbeit aus der Warteschlange zu ziehen und sie auszuführen.
Ich habe es folgendermaßen gemacht:
exec('nohup ' . sfConfig::get('sf_root_dir') . '/symfony TASKNAME >/dev/null &');
Sie müssen STDOUT umleiten, sonst läuft es nicht im Hintergrund (obwohl Sie /dev/null nicht verwenden müssen, wenn Sie die eigentliche Ausgabe haben wollen). In meinem Fall habe ich alle meine Aufgaben zu verwenden, Symfony's file logger, so dass es kein Problem war.
Ich suche aber immer noch nach einer besseren Lösung. Dies scheint ein Hack zu sein.
Php kennt kein Multithreading.
Und ja, es ist ein großer Fehler in php IMO.
Es gibt eine Möglichkeit, Multithreading zu betreiben, aber es wird nicht empfohlen. Es ist kompliziert und hässlich und es ist eine Frage, kein Aufruf für Probleme.
Also, ich denke, das Beste, was Sie tun können, ist so etwas wie exec, oder maby etwas wie Aufruf eines Webservice wie Call?