<?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