PHP Handbuch
Zurück |  | Weiter

# proc_open

(PHP 4 >= 4.3.0, PHP 5)

proc_open -- Execute a command and open file pointers for input/output

## Beschreibung

resource proc_open ( string cmd, array descriptorspec, array &pipes [, string cwd [, array env [, array other_options]]] )

proc_open() is similar to popen() but provides a much greater degree of control over the program execution.

## Parameter Liste

`cmd`

  The command to execute

`descriptorspec`

  An indexed array where the key represents the descriptor number and the value represents how PHP will pass that descriptor to the child process. 0 is stdin, 1 is stdout, while 2 is stderr.

  The currently supported pipe types are `file` and `pipe` .

  The file descriptor numbers 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 auxiliary file descriptors.

`pipes`

  Will be set to an indexed array of file pointers that correspond to PHP's end of any pipes that are created.

`cwd`

  The initial working dir for the command. This must be an absolute directory path, or `NULL` if you want to use the default value (the working dir of the current PHP process)

`env`

  An array with the environment variables for the command that will be run, or `NULL` to use the same environment as the current PHP process

`other_options`

  Allows you to specify additional options. Currently supported options include:

  `suppress_errors` (windows only): suppresses errors generated by this function when it's set to `TRUE`
  `bypass_shell` (windows only): bypass `cmd.exe` shell when set to `TRUE`
  `context`: stream context used when opening files (created with stream_context_create())
  `binary_pipes`: open pipes in binary mode, instead of using the usual `stream_encoding`

## Rückgabewerte

Returns a resource representing the process, which should be freed using proc_close() when you are finished with it. On failure returns `FALSE`.

## ChangeLog

Version | Beschreibung
--- | ---
6.0.0 | Added the `context` and `binary_pipes` options to the `other_options` parameter.
5.2.1 | Added the `bypass_shell` option to the `other_options` parameter.
5.0.0 | Added the `cwd`, `env` and `other_options` parameters.

## Beispiele

Beispiel 1. A proc_open() example
`<?php $descriptorspec = array( 0 => 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 ); $cwd = '/tmp'; $env = array('some_option' => 'aeiou'); $process = proc_open('php', $descriptorspec, $pipes, $cwd, $env); 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], '<?php print_r($_ENV); ?>'); fclose($pipes[0]); echo stream_get_contents($pipes[1]); fclose($pipes[1]); // It is important that you close any pipes before calling // proc_close in order to avoid a deadlock $return_value = proc_close($process); echo "command returned $return_value\n"; } ?>`
Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:
    Array
    (
        [some_option] => aeiou
        [PWD] => /tmp
        [SHLVL] => 1
        [_] => /usr/local/bin/php
    )
    command returned 0

## Anmerkungen

> Anmerkung: 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.

> Anmerkung: If you only need a uni-directional (one-way) process pipe, use popen() instead, as it is much easier to use.

## Siehe auch

popen()
exec()
system()
passthru()
stream_select()
The backtick operator

Zurück | Zum Anfang | Weiter
proc_nice | Nach oben | proc_terminate