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) 中的可执行文件作为第一行。有关更多信息,请参阅系统的手册 execve(2) 页面。

args

args 是传递给程序的参数字符串数组。

env_vars

env_vars 是作为环境传递给程序的字符串数组。该数组的格式为名称 => 值,键为环境变量的名称,值为该变量的值。

返回值

返回 false

添加注释

用户贡献的注释 3 条注释

12
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()ed 命令
exit(0);
default
break;
}

// 父进程继续
echo "I am the parent";

--

由于这不是通过 shell 执行的,因此必须提供从文件系统根目录的精确路径。有关更多信息,请查看 execve() 手册页。
10
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');
?>

我将其用作套接字程序的一部分,以便可以从远程位置以不同用户身份运行程序。
3
rbemrose at vgmusic dot com
16 年前
作为旁注,如果我正确理解下面的注释,那么如果您正在使用 PHP Web 服务器模块,则不应运行此命令,因为它会将 Web 服务器的进程替换为您告诉它运行的任何进程。
To Top