0

我想用 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 进程一起运行?

4

2 回答 2

1

最简单的方法,不要使用流程组件并回退到 php exec:

http://php.net/manual/de/function.exec.php

exec('php script.php > /dev/null 2>&1 &');

对于更可靠的解决方案,请考虑类似计划和 crontab 执行的命令,以便在需要启动进程时启动进程。

于 2017-04-05T15:43:21.023 回答
0

您可以使用at( atd) 或cron使用自定义队列。PHP 调用同步命令,该命令将所需命令排入队列以供以后执行。它at是 Unix 系统中相当强大的标准组件。您只需运行at now + 10 min并将命令推送到其标准输入,然后atd守护程序将在 10 分钟内运行您的命令。

如果您希望直接从 PHP 运行命令,请尝试添加 shell: new Process('/bin/sh -c "php script.php &"')。我不确定 Process 类是如何调用该命令的,但如果 & 不起作用,那么中间的另一个 shell 就可以解决问题(就是这样exec()做的)。

于 2017-04-06T11:52:15.050 回答