回复 https://php.net/manual/en/function.posix-getppid.php#120088
如果您正在使用 proc_open,并且想要获取调用 php 进程的 pid,请使用带有“exec php $scriptname”用法的 proc open。在这种情况下,您可以获取真实的父 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,请使用带有“exec php $scriptname”用法的 proc open。在这种情况下,您可以获取真实的父 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 的 pid 启动的 shell。要获取您的 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 提供的技术)
(我在之前的评论中提到了大部分内容,但我没有一个好的解决方案。现在我有了一个。如果某个有权限的人读到这个,请删除此通知和我的上一条评论好吗?)