首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >后台任务Symfony

后台任务Symfony
EN

Stack Overflow用户
提问于 2019-09-10 15:04:51
回答 3查看 311关注 0票数 1

我想要做的是独立于当前请求运行Symfony命令。

目标:从PDF生成缩略图

问题:我不想在向用户发送响应之前等待生成完成。

代码语言:javascript
复制
    public function __invoke($myparam)
    {
        $command = sprintf(
            'php %s/bin/console ps:media:generate-thumbnail %s %s &',
            $this->kernel->getProjectDir(),
            'destinationPath',
            'sourcePath'
        );

        exec($command);
    }

问题是,在发送响应之前,服务器仍在等待命令完成

EN

回答 3

Stack Overflow用户

发布于 2019-09-10 15:55:34

所以,exec函数正在等待stdio流,所以您只需要将它重新分配到其他地方,/dev/null是很酷的^_^

代码语言:javascript
复制
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);
    }
票数 2
EN

Stack Overflow用户

发布于 2019-09-10 16:33:59

如果您正在使用PHP,在Symfony上处理此类需求的一个好方法是在kernel.terminate事件上使用一个侦听器。从文档中:

handle在发送响应之后(在执行

()方法之后)调度此事件。这对于执行缓慢或复杂的任务很有用,这些任务不需要完成就可以发送响应(例如发送电子邮件)。

除了编写侦听器之外,还必须在$response->send()调用之后将代码片段bellow添加到前端控制器中

代码语言:javascript
复制
$response->send(); 
$kernel->terminate($request, $response);

您可以在symfony文档中找到更多信息

https://symfony.com/doc/current/components/http_kernel.html#component-http-kernel-kernel-terminate

票数 1
EN

Stack Overflow用户

发布于 2019-09-10 16:46:02

您可以使用Cocur Background Progress库来管理后台进程

代码语言:javascript
复制
$command = sprintf(
     'exec php %s/bin/console ps:media:generate-thumbnail %s %s &',
     $this->kernel->getProjectDir(),
     'destinationPath',
     'sourcePath'
);

$process = new BackgroundProcess($command);

$process->run();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57865623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档