Symfony2 — процесс запуска команды symfony2

Моя цель — запустить в фоновом режиме несколько трудоемких функций, чтобы пользователь не дождался ответа сервера.

У меня есть проект Symfony, где я запускаю асинхронный процесс с контроллера. Этот процесс запустит команду Symfony, которая вызовет другой контроллер.

Проблема в том, когда я вызываю процесс с start()

$process = new Process('/usr/bin/php '.$this->get('kernel')->getRootDir().'/console scopusftpupload ' . escapeshellcmd($params));
$process->start();

Тогда ничего не происходит с процессом, но работает редирект и какой-то другой код, который у меня позже.

Однако, если я сделаю

$process->run();

Затем процесс работает нормально, но мне нужно подождать, пока процесс не закончится, чтобы отобразить представление.

Есть идеи, что я делаю не так?

2

Решение

Я нашел обходной путь к этой проблеме, используя exec вместо создания нового объекта Process.

exec('/usr/bin/php '.$this->get('kernel')->getRootDir().'/console scopusftpupload ' . escapeshellcmd($params) . ' > /dev/null 2>&1 &');
3

Другие решения

Мы выполняем нашу асинхронную обработку с сервером заданий Gearman — http://gearman.org/

Существуют пакеты, которые упрощают использование Gearman в проекте Symfony. Мы используем mmoreram / GearmanBundle — https://github.com/mmoreram/GearmanBundle. По сути, вы создаете своего работника, который может быть сервисом, и вызываете его для выполнения трудоемких задач. Мы используем его для импорта данных, который занимает много времени.

0