Моя цель — запустить в фоновом режиме несколько трудоемких функций, чтобы пользователь не дождался ответа сервера.
У меня есть проект Symfony, где я запускаю асинхронный процесс с контроллера. Этот процесс запустит команду Symfony, которая вызовет другой контроллер.
Проблема в том, когда я вызываю процесс с start()
$process = new Process('/usr/bin/php '.$this->get('kernel')->getRootDir().'/console scopusftpupload ' . escapeshellcmd($params));
$process->start();
Тогда ничего не происходит с процессом, но работает редирект и какой-то другой код, который у меня позже.
Однако, если я сделаю
$process->run();
Затем процесс работает нормально, но мне нужно подождать, пока процесс не закончится, чтобы отобразить представление.
Есть идеи, что я делаю не так?
Я нашел обходной путь к этой проблеме, используя exec вместо создания нового объекта 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. По сути, вы создаете своего работника, который может быть сервисом, и вызываете его для выполнения трудоемких задач. Мы используем его для импорта данных, который занимает много времени.