proc_open

(PHP 4 >= 4.3.0, PHP 5)

proc_open --  Ejecutar un comando y abrir apuntadores de archivo para entrada/salida

Descripción

resource proc_open ( string cmd, array espec_descriptor, array &pipes [, string cwd [, array env [, array otras_opciones]]] )

proc_open() es similar a popen() pero provee un grado de control mucho mayor sobre la ejecución del programa.

PHP 5 introduce soporte pty para sistemas con ptys Unix98. Esto le permite a su script interactuar con aplicaciones que esperan hablar con una terminal. Un pty trabaja como un pipe, pero es bi-direccional, así que no hay necesidad de especificar un modo de lectura/escritura. El ejemplo presentado más adelante muestra cómo usar un pty, note que no tiene que tener todos los descriptores hablando con un pty. También note que solo un pty es creado, aun cuando se especifica pty 3 veces. En una futura versión de PHP, puede que sea posible hacer más que solo leer y escribir en el pty.

Lista de parámetros

cmd

El comando a ejecutar

espec_descriptor

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 únicos tipos de pipe soportados son file, pipe y pty.

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.

pipes

Recibirá como valor una matriz indexada de apuntadores de archivo que corresponden a los valores en PHP de los pipes creados.

cwd

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)

env

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

otras_opciones

Le permite especificar opciones adicionales. En la actualidad solo se reconoce suppress_errors, opción que elimina los errores generados por esta función cuando su valor es TRUE

Valores retornados

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.

Registro de cambios

VersiónDescripción
5.0.0. Se añadieron los parámetros cwd, env y otras_opciones. Se agregó soporte para ptys Unix98.

Ejemplos

Ejemplo 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/error-output.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 estandar del hijo
    // 1 => gestor de lectura conectado con la salida estandar del hijo
    // Cualquier mensaje de salida de error sera adicionado a /tmp/error-output.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

Ejemplo 2. Uso de ptys

<?php
// Crear una pseudo terminal para el proceso hijo
$espec_descriptor = array(
   
0 => array("pty"),
   
1 => array("pty"),
   
2 => array("pty")
);
$proceso = proc_open("cvs -d:pserver:cvsread@cvs.php.net:/repository login", $espec_descriptor, $pipes);
if (
is_resource($proceso)) {
   
// trabaje con el recurso aqui
}
?>

Notes

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

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

Ver también

popen()
exec()
system()
passthru()
stream_select()
El operador de comilla invertida

Hosting by: hurra.com
Generated: 2007-01-26 18:01:05