如何解决如何在后台执行来自控制器的命令?
我在 Symfony 中创建了一个命令。这将运行并将数据插入到数据库中。我已经测试过了,运行良好。
现在我的问题是我需要从用户单击按钮的 Web 界面执行此命令,并且需要进行此插入。此插入将需要大约 30-45 分钟。所以我需要在后台运行它。
我在 Symfony 中听说过 Process
。
所以我创建了一个带有路由的控制器,当被调用时会执行以下几行。
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);
但是什么都没有发生。它只显示最后的响应消息。
有人可以帮我吗?
解决方法
看看this
从上面的链接中提取....
假设这是在 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。 https://www.rabbitmq.com/tutorials/tutorial-one-php.html 推送带有操作信息的消息,然后在消费者中接收该消息并完成工作。 https://symfony.com/doc/current/messenger.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。