Cep*_*fan 5 background-process symfony symfony-process
我为我的 symfony2 项目创建了一个控制台命令,我想从控制器执行它而不阻塞控制器输出(在后台)。
通常是这样执行的:
$application = new Application($kernel);
$application->setAutoExit(true);
// AppBundle/Command/UpdateStockCommand.php
$input = new ArrayInput(array(
'command' => 'update:stock',
));
$output = new NullOutput();
$application->run($input, $output);
Run Code Online (Sandbox Code Playgroud)
但是像这样运行,用户将不得不等待任务完成,这可能需要几分钟。
一个解决办法是:
$kernel = $this->get('kernel');
$process = new \Symfony\Component\Process\Process('nohup php '. $kernel->getRootDir() .'/console update:stock --env='. $kernel->getEnvironment() .' > /dev/null 2>&1 &');
//$process->start();
$process->run();
Run Code Online (Sandbox Code Playgroud)
没有给出错误,控制器呈现输出,但不执行任务。
另一种解决方案是:
exec('/usr/bin/php '.$this->get('kernel')->getRootDir().'/console update:stock --env=dev > /dev/null 2>&1 &');
Run Code Online (Sandbox Code Playgroud)
在此处找到Symfony2 - 进程启动 symfony2 命令, 但不适用于我的示例。
系统中的所有进程都有自己的层次结构。
例如:我们有一个Process A
,启动后我们运行Process B
。如果你杀了Process A
,那么Process B
被杀的就来了,因为Process B
是孩子的Process A
。
每个请求 (http) Apache 都会创建一个新的子进程来运行 PHP 代码并将 stdoutput 返回到客户端(Nginx + PHPFPM 的逻辑 - 相同)。创建子进程(通过)后Symfony/Process library
,该进程是 apache 或 fpm 进程的子进程。完成请求后(返回响应给apache或nginx),服务器杀死子进程(执行PHP代码的地方)。
在我的项目中,为了运行后台任务,我使用 RabbitMQ。
归档时间: |
|
查看次数: |
4561 次 |
最近记录: |