PHP - 在不同的文件上终止 proc_open() 进程?

PHP - Kill proc_open() process on different file?

我正在使用 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() 的情况下停止它?

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

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

或者,parent 进程可以使用 proc_get_status() 获取 child 的 pid,并将 pid 写入某处供以后使用。 (如果您需要 运行 child and/or 的多个实例,这可能更合适 child 不能以这种方式修改。)

此外,需要注意的重要一点是,在您对 proc_open 的调用中,您正试图要求 shell 在后台跨越进程。这是完全没有必要的。 proc_open 自己执行此操作,并通过强制 shell 成为中介,您实际上连接到 shell,而不是您尝试启动的进程。 (这意味着当您的脚本存在时,这也会导致 shell 杀死 child,而不是 child 在后台继续 运行。)