我想使用Symfony Process组件运行一个孤立的后台进程。我不能使用kernel.terminate事件。 这就是我试图做的事情:
这是我想要运行的过程:
// script.php
$f = fopen('test'.uniqid().'.txt', 'w');
for ($i = 0; $i < 1000; $i++) {
fwrite($f, "Line $i \n");
sleep(2);
}
fclose ($f);
这是我想要运行我的过程的脚本:
// test.php
$command = "php script.php > /dev/null 2>&1 &";
$p = new \Symfony\Component\Process\Process($command);
$p->start();
echo $p->getPid()."\n";
问题是在test.php
终止后,script.php
无效。主脚本的终止会终止所有子进程。是否可以使用Symfony Process运行孤立进程?
答案 0 :(得分:1)
最简单的方法,不要使用Process Component并回退到php exec:
http://php.net/manual/de/function.exec.php
exec('php script.php > /dev/null 2>&1 &');
对于更加可靠的解决方案,请考虑类似于schedule和crontab执行的命令,以便在需要启动时启动该过程。
答案 1 :(得分:0)
您可以将at
(atd
)或cron
与自定义队列一起使用。 PHP调用同步命令,该命令将所需命令排入队列以便以后执行。 at
是unix系统非常强大和标准的组件。您只需运行at now + 10 min
并将命令推送到其stdin,然后atd
守护程序将在10分钟内运行您的命令。
如果您希望直接从PHP运行命令,请尝试添加shell:new Process('/bin/sh -c "php script.php &"')
。我不确定Process类究竟是如何调用命令的,但是如果&amp;不起作用,中间还有一个shell可以解决问题(这就是exec()
所做的事情。)