Как правильно запустить задачу Symfony в фоновом режиме из действия? - PullRequest
5 голосов
/ 21 декабря 2010

Как правильно запускать задачи Symfony в отдельном процессе. Моим первым предположением было бы использование fork / exec, но согласно this вы не можете делать это с чем-либо, что поддерживает дескрипторы открытых файлов или соединения (например, MySQL). Так что это не похоже на вариант. Другая альтернатива - сделать exec('symfony taskname &'), но это похоже на взлом. Это лучшее, что я могу сделать? Есть ли третий путь?

Ответы [ 3 ]

4 голосов
/ 23 декабря 2010

Способ, которым это обычно обрабатывается, заключается в использовании очереди задач. Если вы хотите выполнить фоновый процесс, добавьте его в какую-либо очередь (вы можете использовать свою базу данных или использовать реального демона очереди, такого как beanstalkd). Затем у вас есть несколько демонизированных процессов, задача которых - вытащить работу из очереди и выполнить ее.

3 голосов
/ 23 декабря 2010

Вот как я это сделал:

exec('nohup ' . sfConfig::get('sf_root_dir') . '/symfony TASKNAME >/dev/null &');

Вы должны перенаправить STDOUT, иначе он не будет работать в фоновом режиме (хотя вам не нужно использовать / dev / null, если вы хотите фактический вывод). В моем случае я настроил все свои задачи на использование файлового логгера Symfony, так что это не проблема.

Я все еще ищу лучшее решение. Это похоже на взлом.

0 голосов
/ 21 декабря 2010

Php не знает многопоточности.
И да, это большой недостаток в php IMO.
Есть способ сделать многопоточность, но это не рекомендуется.Это сложно, и это уродливо и требует, не вызывая проблем.

Итак, я думаю, лучшее, что вы можете сделать, это что-то вроде exec или что-то вроде вызова веб-службы, такой как call?

...