PCNTL 函数
在线手册:中文 英文
PHP手册

pcntl_exec

(PHP 4 >= 4.2.0, PHP 5)

pcntl_exec在当前进程空间执行指定程序

说明

void pcntl_exec ( string $path [, array $args [, array $envs ]] )

以给定参数执行程序。

参数

path

path必须时可执行二进制文件路径或一个在文件第一行指定了 一个可执行文件路径标头的脚本(比如文件第一行是#!/usr/local/bin/perl的perl脚本)。 更多的信息请查看您系统的execve(2)手册。

args

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

envs

envs是一个要传递给程序作为环境变量的字符串数组。这个数组是 key => value格式的,key代表要传递的环境变量的名称,value代表该环境变量值。

返回值

当发生错误时返回 FALSE ,没有错误时没有返回。


PCNTL 函数
在线手册:中文 英文
PHP手册
PHP手册 - N: 在当前进程空间执行指定程序

用户评论:

trevorpearce at gmail dot com (23-Jan-2012 02:36)

I spent a lot of time trying to figure this powerful option out so I didn't get error 2 or error 8. The documentation says it can execute a binary file and here is a good example that works that I found;

    print "Before\n";
    pcntl_exec("/usr/bin/uptime");
    print "After\n";

However I wanted it to run another php program and after wasting a lot of time I finally got it.

$tasks2=array('/var/www/example.php');
pcntl_exec("/usr/bin/php",$tasks2);

The php script has to be in an array and you execute the binary php file

I'll be adding this to launching a child and run it seperately using this function

function launchchild($programexe,$programvars)
{
//foreach ($tasks as $key => $v){
   switch ($pid = pcntl_fork()) {
      case -1:
         // @fail
         die('Fork failed');
         break;

      case 0:
         // @child: Include() misbehaving code here
         print "FORK: Child #{$x} \n";
         echo "child after fork:", getmypid(), PHP_EOL;
         pcntl_exec($programexe,$programvars);
         // generate_fatal_error(); // Undefined function
         break;

      default:
         // @parent
         print "FORK: $x Parent\n";
         echo "parent after fork:", getmypid(), PHP_EOL;
         // pcntl_waitpid($pid, $status);
         break;
   }

print "Done! :^)\n\n";
}

fahadsadah at gmail dot com dot please dot remove dot this (28-Jun-2008 03:44)

Just a note regarding what rbemrose at vgmusic dot com said:
Once the executed process ends, control returns to the webserver process.

rbemrose at vgmusic dot com (06-Feb-2008 10:44)

As a side note, if I'm reading the comments below correctly, you should not run this if you're using a PHP webserver module, as it will replace the webserver's process with whatever process you're telling it to run.

agodong at verizon dot net (07-Dec-2006 06:47)

Some people might find it useful to run other program using the same process as a different user. This is very usefull if the script is running under root. Here is a simple code to achieve that under *nix PHP CLI:

#!/usr/bin/php -q
<?php
//Enter run-as user below (argument needed to be passed when the script is called), otherwise it will run as the caller user process.

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

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

I use this as a part of socket program so that a program can be run under different user from remote location.

eric kilfoil (24-Oct-2006 06:01)

The pcntl_exec() function works exactly like the standard (unix-style) exec() function.  It differs from the regular PHP exec() function in that the process calling the pcntl_exec() is replaced with the process that gets called.  This is the ideal method for creating children.  In a simple example (that does no error checking):

switch (pcntl_fork()) {
  case 0:
    $cmd = "/path/to/command";
    $args = array("arg1", "arg2");
    pcntl_exec($cmd, $args);
    // the child will only reach this point on exec failure,
    // because execution shifts to the pcntl_exec()ed command
    exit(0);
  default:
    break;
}

// parent continues
echo "I am the parent";

--

since this is not being executed through a shell, you must provide the exact path from the filesystem root.  Look at the execve() man page for more information.

michael dot ferre at mobileway dot com (20-Nov-2002 11:28)

//To complete my last note
//If you use some object in your php code
//You will have some problem if you do a exit after include the
//child scripts
//You must use posix_kill() like that :

$CHILD_PID = pcntl_fork();
if($CHILD_PID == 0)
{   
  include ($script_path);
  posix_kill(getmypid(),9);
}

//This code is very simple it can be ameliorate ;)

michael dot ferre at mobileway dot com (19-Nov-2002 12:19)

//If you are in php version between 4.1 and 4.2
//When you use pcntl_fork and after you want use
//pcntl_exec, you can because pcntl_exec isn't used before
//php 4.2 so let me show a solution :

$CHILD_PID = pcntl_fork();
if($CHILD_PID == 0)
{   
   include ($script_path);
   exit;
}

//$script_path is the  *.php page which you want lauch like
// a child .

//I don't know why php coder hadn't add  pcntl_exec in the
//same time that other function

//Michal F. php developer .