php - php运行后台任务,而不必等待进程完成

  显示原文与译文双语对照的内容
134 1

用户提交表单后,希望呈现视图文件,然后在创建后台任务之后,希望启动后台任务,以便用户不必等待进程完成,以便查看该页。 完成任务后,我将通过电子邮件通知用户。

我正在使用Symfony框架 3 。 我已经将我的代码。 它不做我想要实现的。 提交表单后,只有整个后台任务完成后,页面才会加载。

我不确定,但在谷歌搜索之后,我认为的kernel.terminate 事件可以能在这里有用。 但我似乎不理解如何使用它。

你能告诉我怎么解决这个问题?

这是我的代码:

我已经创建了一个控制台命令:


class GreetCommand extends ContainerAwareCommand {



 protected function configure()


 {


 $this->setName('hello:world');


 }



 protected function execute(InputInterface $input, OutputInterface $output)


 {


//My code to execute


 }



}



在我的控制器里


$process = new Process('ls -lsa');


$process->disableOutput();


$that = $this;



$process->start(function ($type, $buffer) use ($that) {


 $command = new GreetCommand();


 $command->setContainer($this->container);


 $input = new ArrayInput(array());


 $output = new NullOutput;


 $resultCode = $command->run($input, $output);



 });



 return $this->render('success.html.php', array('msg' => 'Registraion Successful'));



更新

我使用PHP的连接处理功能解决了这个问题。

感谢这个帖子。

时间: 原作者:

78 1

异步运行进程

你还可以启动子流程,然后让它异步运行,在你需要时检索主进程中的输出和状态。 使用 start() 方法启动异步进程

文档文档

因此,要异步启动命令,应该使用命令创建新进程并启动它


$process = new Process('php bin/console hello:word');


$process->start();



考虑将它的更改为完整路径,如 usrbinphp varwwwhtmlbinconsole hello:word

此外,还有不错的捆绑包 cocur/后台进程,你可以使用它,或者至少阅读文档来了解它是如何工作的。

108 3

要在控制器中使用:


use SymfonyComponentHttpKernelKernelEvents;


use SymfonyComponentHttpKernelEventPostResponseEvent;



$myVar = new MyObject();


$this->get('event_dispatcher')->addListener(KernelEvents::TERMINATE, function(PostResponseEvent $event) use($myVar) {


//You logic here


 $request = $event->getRequest();


 $test = $myVar->getMyStuff();


});



但这不是一个好的实践,请阅读普通的注册事件监听器。

kernel.terminate 事件将在用户发送响应后调度。

原作者:
67 5

我想你想要在数据库中存储必要的数据,然后使用 cronjob/队列执行实际命令。

在/etc/crontab 中添加类似下面的内容,让它每 5分钟运行一次命令


*/5 * * * * root/usr/bin/php/path/to/bin/console hello:world



然后,让命令查询存储数据的数据库,并让它处理excel文件

97 4

有一个包调用 AsyncServiceCallBundle,它允许你在后台调用你的服务方法。

关于如何在内部实现它的更详细的信息,你可以参考 你所需要的一切是调用你的服务方法,如下所示:


$this->get('krlove.async')->call('service_id', 'method', [$arg1, $arg2]);



...