PHP Conference Japan 2024

pcntl_exec

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pcntl_exec在目前的行程空間中執行指定的程式

說明

pcntl_exec(字串 $path, 陣列 $args = [], 陣列 $env_vars = []): 布林值

使用給定的引數執行程式。

參數

path

path 必須是二進制可執行檔的路徑,或是腳本的路徑,且該腳本的第一行必須是一個有效的 shebang (例如 #!/usr/local/bin/perl),指向一個可執行檔。更多資訊請參考您系統的 man execve(2) 頁面。

args

args 是一個傳遞給程式的字串引數陣列。

env_vars

env_vars 是一個字串陣列,作為環境變數傳遞給程式。陣列格式為 name => value,key 是環境變數的名稱,value 是該變數的值。

傳回值

傳回 false

新增筆記

使用者貢獻的筆記 3 筆筆記

eric kilfoil
18 年前
pcntl_exec() 函式的運作方式與標準 (Unix 風格) 的 exec() 函式完全相同。它與一般的 PHP exec() 函式的不同之處在於,呼叫 pcntl_exec() 的行程會被呼叫的行程取代。這是建立子行程的理想方法。在一個簡單的範例中 (沒有進行錯誤檢查):

switch (pcntl_fork()) {
case 0:
$cmd = "/path/to/command";
$args = array("arg1", "arg2");
pcntl_exec($cmd, $args);
// 子行程只會在 exec 失敗時才會到達這裡,
// 因為執行會轉移到 pcntl_exec() 呼叫的命令
exit(0);
default:
break;
}

// 父行程繼續執行
echo "我是父行程";

--

因為這不是透過 shell 執行的,所以您必須提供從檔案系統根目錄開始的完整路徑。更多資訊請參考 execve() 的 man 頁面。
agodong at verizon dot net
17 年前
有些人可能會覺得以不同使用者的身份,使用相同的行程執行其他程式很有用。如果腳本是以 root 身份執行,這會非常有用。以下是在 *nix PHP CLI 下實現此目的的簡單程式碼:

#!/usr/bin/php -q
<?php
//在下方輸入要執行的使用者 (呼叫腳本時需要傳遞參數),否則將以呼叫者使用者行程執行。

$username = $_SERVER['argv'][1];

$user = posix_getpwnam($username);
posix_setuid($user['uid']);
posix_setgid($user['gid']);
pcntl_exec('/path/to/cmd');
?>

我將其作為 socket 程式的一部分,以便可以從遠端位置以不同使用者的身份執行程式。
rbemrose at vgmusic dot com
16 年前
順帶一提,如果我沒有理解錯下面的註解,如果您正在使用 PHP 網頁伺服器模組,則不應該執行此函式,因為它會將網頁伺服器的行程替換為您指示它執行的行程。
To Top