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的连接处理功能解决了这个问题。

感谢这个帖子。

时间:原作者:0个回答

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]);
原作者:
...