我想要做的是独立于当前请求运行Symfony命令。
目标:从PDF生成缩略图
问题:我不想在向用户发送响应之前等待生成完成。
public function __invoke($myparam)
{
$command = sprintf(
'php %s/bin/console ps:media:generate-thumbnail %s %s &',
$this->kernel->getProjectDir(),
'destinationPath',
'sourcePath'
);
exec($command);
}问题是,在发送响应之前,服务器仍在等待命令完成
发布于 2019-09-10 15:55:34
所以,exec函数正在等待stdio流,所以您只需要将它重新分配到其他地方,/dev/null是很酷的^_^
public function __invoke($myparam)
{
$command = sprintf(
'php %s/bin/console ps:media:generate-thumbnail %s %s > /dev/null &',
$this->kernel->getProjectDir(),
'destinationPath',
'sourcePath'
);
exec($command);
}发布于 2019-09-10 16:33:59
如果您正在使用PHP,在Symfony上处理此类需求的一个好方法是在kernel.terminate事件上使用一个侦听器。从文档中:
handle在发送响应之后(在执行
()方法之后)调度此事件。这对于执行缓慢或复杂的任务很有用,这些任务不需要完成就可以发送响应(例如发送电子邮件)。
除了编写侦听器之外,还必须在$response->send()调用之后将代码片段bellow添加到前端控制器中
$response->send();
$kernel->terminate($request, $response);您可以在symfony文档中找到更多信息
https://symfony.com/doc/current/components/http_kernel.html#component-http-kernel-kernel-terminate
发布于 2019-09-10 16:46:02
您可以使用Cocur Background Progress库来管理后台进程
$command = sprintf(
'exec php %s/bin/console ps:media:generate-thumbnail %s %s &',
$this->kernel->getProjectDir(),
'destinationPath',
'sourcePath'
);
$process = new BackgroundProcess($command);
$process->run();https://stackoverflow.com/questions/57865623
复制相似问题