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