Моя цель состоит в том, чтобы запустить несколько временных функций в фоновом режиме, чтобы пользователь не дождался ответа сервера.
У меня есть проект Symfony, где я запускаю асинхронный процесс с контроллера. Этот процесс запустит команду Symfony, которая вызовет другой контроллер.
Проблема в том, что я вызываю процесс с помощью start()
$process = new Process('/usr/bin/php '.$this->get('kernel')->getRootDir().'/console scopusftpupload ' . escapeshellcmd($params)); $process->start();
Тогда ничего не происходит с процессом, но перенаправление и некоторый другой код, который у меня есть, работает позже.
Однако, если я это сделаю
$process->run();
Затем процесс работает отлично, но мне нужно подождать, пока процедура не будет завершена, чтобы отобразить представление.
Любая идея, что я делаю неправильно?
Я нашел обходной путь этой проблемы, используя exec instaed для создания нового объекта Process.
exec('/usr/bin/php '.$this->get('kernel')->getRootDir().'/console scopusftpupload ' . escapeshellcmd($params) . ' > /dev/null 2>&1 &');
Мы выполняем нашу асинхронную обработку с сервера задания Gearman – http://gearman.org/
Есть пакеты, которые упрощают использование Gearman в проекте Symfony. Мы используем mmoreram / GearmanBundle – https://github.com/mmoreram/GearmanBundle . В принципе, вы создаете своего работника, который может быть сервисом, и назовите его для выполнения трудоемких задач. Мы используем его для импорта данных, которые занимают много времени.