回覆 https://php.dev.org.tw/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.dev.org.tw/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 "Child: $pid Parent: $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 提供此技巧)
(我在之前的評論中提到了大部分內容,但我沒有很好的解決方案。現在我有了。如果有權限的人讀到這篇文章,可以刪除這則通知和我之前的評論嗎?)