PHP - 在不同的文件上杀死proc_open()进程?

时间:2016-01-28 20:58:23

标签: php process proc-open

我正在使用proc_open()创建后台进程,并且想知道如何在不同的文件或操作中取消或停止此后台进程,而我的后台进程仍在运行?

这是我的代码:

$errorLog = './error.log';
$descriptorspec = array(
    0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
    1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
    2 => array("file", $errorLog, "a") // stderr is a file to write to
);
proc_open("/var/bin/php /home/hello/myscript.php &", $descriptorspec, $pipes);

我已经阅读了proc_terminate($process),但似乎需要proc_open()返回来停止该过程。有没有办法在同一个脚本中没有proc_open()的情况下阻止它?

1 个答案:

答案 0 :(得分:1)

执行此操作的典型方法是让子脚本获取其进程ID(在PHP中使用getmypid())并写出包含此pid的文件(通常类似于myscript.pid)。 / p>

然后,任何想要终止该脚本的任何其他内容都会检查pid文件是否存在,读取它(并且可能是为了健壮性,检查该pid中的目标进程是什么),然后杀死目标进程。在PHP中,您可以使用posix_kill()执行此操作。 (通常情况下,您会发送SIGTERMSIGKILL,但SIGHUPSIGINT,甚至SIGUSR1SIGUSR2都是合适的,具体取决于发信号时你希望子进程做什么。

或者,父进程可以使用proc_get_status()获取子进程的pid,并将pid写在某处以供以后使用。 (如果您需要运行子项的多个实例和/或无法以这种方式修改子项,这可能更合适。)

另外,需要注意的是,在调用proc_open时,您试图让shell在后台跨越该过程。这完全没必要。 proc_open自己做,并且通过强制shell成为中介,你实际上是连接到shell,而不是你试图启动的进程。 (这意味着当你的脚本存在时,这也会导致shell杀死孩子,而不是孩子继续在后台运行。)