Php 如何在后台执行来自控制器的命令?

Php 如何在后台执行来自控制器的命令?,php,symfony4,Php,Symfony4,我已经在Symfony中创建了一个命令。这将运行并将数据插入数据库。我已经测试过了,运行良好 现在我的问题是,我需要从web界面执行此命令,用户在该界面上单击按钮,然后需要执行此插入操作。插入过程大约需要30-45分钟。所以我需要在后台运行它 我在Symfony听说过过程 因此,我创建了一个带有路由的控制器,该路由在被调用时执行以下命令行 use Symfony\Component\Process\Process; $process = new Process('php bin/consol

我已经在Symfony中创建了一个命令。这将运行并将数据插入数据库。我已经测试过了,运行良好

现在我的问题是,我需要从web界面执行此命令,用户在该界面上单击按钮,然后需要执行此插入操作。插入过程大约需要30-45分钟。所以我需要在后台运行它

我在Symfony听说过
过程

因此,我创建了一个带有路由的控制器,该路由在被调用时执行以下命令行

use Symfony\Component\Process\Process;


$process = new Process('php bin/console app:import:records' . '  > NUL');
$process->run();
return new Response('successfully done', Response::HTTP_OK);
但什么都没有发生。它只显示最后一条消息

有人能帮我吗?

看一看

从上面的链接中提取


假设它在Linux机器上运行,我总是这样处理它:

exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile));
这将启动命令
$cmd
,将命令输出重定向到
$outputfile
,并将进程id写入
$pidfile

这使您可以轻松监控流程正在做什么以及流程是否仍在运行

function isRunning($pid){
    try{
        $result = shell_exec(sprintf("ps %d", $pid));
        if( count(preg_split("/\n/", $result)) > 2){
            return true;
        }
    }catch(Exception $e){}

    return false;
}

您可以为此使用RabbitMQ。 推送带有操作信息的消息,然后在consumer中接收该消息并执行该工作。

这是否回答了您的问题?“但什么都没发生”是什么意思?您已检查您的操作是否未完成?您的PHP执行时间足够长吗?我不能使用Process吗?@Ihor我希望
('PHP bin/console app:import:records
)在后台继续运行。谢谢。但我现在需要快速解决方案。没有时间使用rabbitMQ