(PHP 4 >= 4.3.0, PHP 5)
proc_open — Ejecutar un comando y abrir apuntadores de archivo para entrada/salida
proc_open() es similar a popen() pero provee un grado de control mucho mayor sobre la ejecución del programa.
El comando a ejecutar
Una matriz indexada en donde las llaves representan el número del descriptor y el valor representa el modo en que PHP pasará el descriptor al proceso hijo. 0 es stdin, 1 es stdout, y 2 es stderr.
Los tipos de pipe soportados actualmente son file y pipe .
Los números de descriptor de archivo no se limitan a 0, 1 y 2 - es posible que especifique cualquier número de descriptor de archivo válido y éste será pasado al proceso hijo. Esto le permite a su script interoperar con otros scripts que corren como "co-procesos". En particular, esto es útil para pasar frases secretas a programas como PGP, GPG y openssl de una forma más segura. También es útil para leer información de status ofrecida por esos programas en descriptores de archivo auxiliares.
Recibirá como valor una matriz indexada de apuntadores de archivo que corresponden a los valores en PHP de los pipes creados.
El directorio de trabajo inicial para el comando. Este debe ser una ruta de directorio absoluta, o NULL si desea usar el valor predeterminado (el directorio de trabajo del proceso PHP actual)
Una matriz con las variables de entorno para el comando que será ejecutado, o NULL para usar el mismo entorno que el proceso PHP actual
Le permite especificar opciones adicionales. Las opciones actualmente soportadas incluyen:
Devuelve un recurso que representa el proceso, el cual debe ser liberado usando proc_close() cuando haya terminado de usarlo. En caso de error, devuelve FALSE.
Versión | Descripción |
---|---|
6.0.0 | Se agregaron las opciones context y binary_pipes al parámetro otras_opciones . |
5.2.1 | Se agregó la opción bypass_shell al parámetro otras_opciones . |
5.0.0 | Se añadieron los parámetros cwd , env y otras_opciones . |
Example#1 Un ejemplo de proc_open()
<?php
$espec_descriptor = array(
0 => array("pipe", "r"), // stdin es un pipe usado por el hijo para lectura
1 => array("pipe", "w"), // stdout es un pipe usado por el hijo para escritura
2 => array("file", "/tmp/salida-errores.txt", "a") // stderr es un archivo para escritura
);
$cwd = '/tmp';
$env = array('una_opcion' => 'aeiou');
$proceso = proc_open('php', $espec_descriptor, $pipes, $cwd, $env);
if (is_resource($proceso)) {
// $pipes ahora luce de esta forma:
// 0 => gestor de escritura conectado con la entrada estándar del hijo
// 1 => gestor de lectura conectado con la salida estándar del hijo
// Cualquier mensaje de salida de error será adicionado a /tmp/salida-errores.txt
fwrite($pipes[0], '<?php print_r($_ENV); ?>');
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
// Es importante que cierre todos los pipes antes de llamar
// proc_close para evitar un bloqueo muerto
$retval = proc_close($proceso);
echo "el comando ha devuelto $retval\n";
}
?>
El resultado del ejemplo seria algo similar a:
Array ( [some_option] => aeiou [PWD] => /tmp [SHLVL] => 1 [_] => /usr/local/bin/php ) el comando ha devuelto 0
Note: Compatibilidad con Windows: Los descriptores más allá de 2 (stderr) se ponen a disposición del proceso hijo como gestores heredables, pero ya que la arquitectura de Windows no asocia números de descriptores de archivo con gestores de bajo nivel, el proceso hijo no tiene (aun) una forma de acceder a esos gestores. Stdin, stdout y stderr funcionan como es de esperarse.
Note: Si solo necesita un pipe de proceso uni-direccional (de una vía), use popen() en su lugar, ya que es mucho más fácil de usar.