diff --git a/functions/exec.xml b/functions/exec.xml index a19c26a107..c3a6847fa4 100644 --- a/functions/exec.xml +++ b/functions/exec.xml @@ -1,5 +1,5 @@ - + Program Execution functions Program Execution @@ -209,6 +209,134 @@ system("touch \"/tmp/$f\"; ls -l \"/tmp/$f\""); // and here we do, so we use quo + + + + proc_close + + Close a process opened by proc_open and return the exit code of that + process. + + + + Description + + intproc_close + resourceprocess + + + proc_close is similar to popen + except that it only works on processes opened by + proc_open. + proc_close waits for the process to terminate, and + returns it's exit code. If you have open pipes to that process, you + should fclose them prior to calling this function in + order to avoid a deadlock - the child process may not be able to exit + while the pipes are open. + + + + + + + proc_open + + Execute a command and open file pointers for input/output + + + + Description + + resourceproc_open + stringcmd + arraydescriptorspec + arraypipes + + + proc_open is similar to popen + but provides a much greater degree of control over the program execution. + cmd is the command to be executed by the shell. + descriptorspec is an indexed array where the + key represents the descriptor number and the value represents how PHP + will pass that descriptor to the child process. + pipes will be set to an indexed array of file + pointers that correspond to PHP's end of any pipes that are created. + The return value is a resource representing the process; you should + free it using proc_close when you are finished + with it. + + + + + array("pipe", "r"), // stdin is a pipe that the child will read from + 1 => array("pipe", "w"), // stdout is a pipe that the child will write to + 2 => array("file", "/tmp/error-output.txt", "a"), // stderr is a file to write to +); +$process = proc_open("php", $descriptorspec, $pipes); +if (is_resource($process)) { + // $pipes now looks like this: + // 0 => writeable handle connected to child stdin + // 1 => readable handle connected to child stdout + // Any error output will be appended to /tmp/error-output.txt + + fwrite($pipes[0], ""); + + while(!feof($pipes[1])) { + echo fgets($pipes[1], 1024); + } + + $return_value = proc_close($process); + + echo "command returned $return_value\n"; +} +]]> + + + + + The file descriptor numbers in descriptorspec are + not limited to 0, 1 and 2 - you may specify any valid file descriptor + number and it will be passed to the child process. This allows your + script to interoperate with other scripts that run as "co-processes". + In particular, this is useful for passing passphrases to programs like + PGP, GPG and openssl in a more secure manner. It is also useful for + reading status information provided by those programs on auxillary + file descriptors. + + + + Windows compatibility: Descriptors beyond 2 (stderr) are made + available to the child process as inheritable handles, but since + the Windows architecture does not associate file descriptor numbers + with low-level handles, the child process does not (yet) have a means + of accessing those handles. Stdin, stdout and stderr work as expected. + + + + + This function was introduced in PHP 4.3.0. + + + + + If you only need a uni-directional (one-way) process pipe, use + popen instead, as it is much easier to use. + + + + + See also exec, system, + passthru, popen, + escapeshellcmd, and the backtick operator. + + + + + +