gpt4 book ai didi

Symfony2 在后台运行控制台命令

转载 作者:行者123 更新时间:2023-12-02 16:10:14 25 4
gpt4 key购买 nike

我已经为我的 symfony2 项目创建了一个控制台命令,我想从 Controller 执行它,而不阻止 Controller 输出(在后台)。

通常是这样执行的:

$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);

但是像这样运行,用户将必须等待任务完成,这可能需要几分钟。

解决方案是:

$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();

没有给出错误, Controller 呈现输出,但任务未执行。

另一个解决方案是:

exec('/usr/bin/php '.$this->get('kernel')->getRootDir().'/console update:stock --env=dev > /dev/null 2>&1 &');

在这里找到Symfony2 - process launching a symfony2 command但不适用于我的示例。

最佳答案

分层处理

系统中的所有进程都有自己的层次结构。

例如:我们有一个进程 A,启动后我们运行进程 B。如果您杀死进程 A,那么进程 B 也会被杀死,因为进程 B 是进程 A 的子进程。

你的问题

每个请求 (http) Apache 都会创建一个新的子进程来运行 PHP 代码并将 stdoutput 返回给客户端(Nginx + PHPFPM 的逻辑 - 相同)。创建子进程后(通过 Symfony/Process 库),该进程是 apache 或 fpm 进程的子进程。完成请求后(返回响应给apache或nginx),服务器杀死子进程(执行PHP代码的地方)。

为您提供的解决方案:

  1. 运行后台命令的好主意 - 使用 nohup (tutorial)
  2. 适用于任何应用程序的不同好主意 - 使用 AMQP进程之间的协议(protocol)。 (tutorial via RabbitMQ)

附注

在我的项目中,为了运行后台任务,我使用 RabbitMQ。

关于Symfony2 在后台运行控制台命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37172386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com