在Symfony2中异步调用命令

dmb*_*dmb 8 php symfony

我想从Symfony2中的Controller内异步调用命令.

到目前为止我找到了以下解决方案:

$cmd = $this->get('kernel')->getRootDir().'/console '.(new MLCJobWorkerCommand)->getName().' '.$job->getId().' 2>&1 > /dev/null';
$process = new Process($cmd);
$process->start();
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来实现这一目标?

编辑:

我需要Process在后台运行,Controller需要在启动前者后立即返回.我试过了:

$cmd = $this->get('kernel')->getRootDir().'/console '
     .(new MLCJobWorkerCommand)->getName()
     .' '.$job->getId().' 2>&1 > /dev/null & echo \$!';
$process = new Process($cmd);
$process->mustRun();
$params["processid"] = $process->getOutput();
Run Code Online (Sandbox Code Playgroud)

但是,在Process完成之前,Controller不会返回响应.

Evg*_*min 5

我同意格里的观点,如果你想"异步",那么你选择的不是最好的方法

我可以推荐RabbitMQ的另一种选择:JMSJobBundle
http://jmsyst.com/bundles/JMSJobQueueBundle/master/installation

您可以在哪里创建一个控制台命令的队列,例如:

class HomeController ... {
    // inject service here
    private $cronJobHelper;
    // inject EM here
    private $em;

    public function indexAction() {
        $job = $this->cronJobHelper->createConsoleJob('myapp:my-command-name', $event->getId(), 10);
        $this->em->persist($job);
        $this->em->persist($job);
        $this->em->flush();
    }
}


use JMS\JobQueueBundle\Entity\Job;

class CronJobHelper{

    public function createConsoleJob($consoleFunction, $params, $delayToRunInSeconds, $priority = Job::PRIORITY_DEFAULT, $queue = Job::DEFAULT_QUEUE){
        if(!is_array($params)){
            $params = [$params];
        }

        $job = new Job($consoleFunction, $params, 1, $queue, $priority);
        $date = $job->getExecuteAfter();
        $date = new \DateTime('now');
        $date->setTimezone(new \DateTimeZone('UTC')); //just in case
        $date->add(new \DateInterval('PT'.$delayToRunInSeconds.'S')); 
        $job->setExecuteAfter($date);

        return $job;
    }
}
Run Code Online (Sandbox Code Playgroud)