回答 https://php.net/manual/en/function.posix-getppid.php#120088
如果您使用的是 proc_open,并且想要获取调用 php 进程的 pid,请使用 proc open,用法为 "exec php $scriptname"。在这种情况下,您可以获取真正的父 id,因为 php 不会启动一个新的 shell。
(PHP 4, PHP 5, PHP 7, PHP 8)
posix_getppid — 返回父进程标识符
此函数没有参数。
返回标识符,作为 int。
示例 #1 posix_getppid() 的示例用法
<?php
echo posix_getppid(); //8259
?>
回答 https://php.net/manual/en/function.posix-getppid.php#120088
如果您使用的是 proc_open,并且想要获取调用 php 进程的 pid,请使用 proc open,用法为 "exec php $scriptname"。在这种情况下,您可以获取真正的父 id,因为 php 不会启动一个新的 shell。
警告,使用 proc_open 时,您的子进程不会通过使用 posix_getppid() 获取父 php 进程的 PID,它实际上会获取由 php 启动的 shell(/bin/sh?)的 pid,然后由 shell 启动子进程。目前我还没有一个好的解决方法,但我正在通过让父进程将它的 pid 写入文件,并让子进程读取文件来解决这个问题。
posix_getppid 在 Windows 上不起作用。
以下是一个替代方法
<?php
if(strncasecmp(PHP_OS, "win", 3) == 0) {
$pid = getmypid(); // 子进程 ID
$parent_pid = shell_exec("wmic process where (processid=$pid) get parentprocessid");
$parent_pid = explode("\n", $parent_pid);
$parent_pid = intval($parent_pid[1]);
echo "子进程: $pid 父进程: $parent_pid\n";
}
?>
使用 proc_open 时,子进程的 ppid 不是您的 php 脚本,而是 proc_open 启动的 shell 的 pid。要获取您的 pid,您的 proc_open 子进程需要获取父进程的父进程(也称为祖父进程)的 pid。以下是在 Linux 上用 PHP 实现此方法的方式
function posix_getpppid(): int {
return ( int ) (explode ( " ", file_get_contents ( "/proc/" . posix_getppid () . "/stat" ) ) [3]);
}
(感谢 irc.freenode.net/##PHP 的 TML 提供的技巧)
(我之前评论中提到了大部分内容,但我没有找到一个好的解决方案。现在我找到了。如果有具有权限的人阅读了此内容,请删除此通知和我的上一条评论,好吗?)