proc_open

(PHP 4 >= 4.3.0)

proc_open --  Executa um comando e abre ponteiros de arquivos para entrada/saída

Descrição

resource proc_open ( string cmd, array descriptorspec, array pipes)

proc_open() é similar a popen() mas provê um controle muito maior sobre a execução do programa. cmd é o comando a ser executado pelo shell. descriptorspec é uma mariz indexada aonde a chave representa o número do descritor e o valor representa como o PHP irá passar o descritor para o processo filho. pipes será definido como uma matriz de ponteiros de arquivos que corresponde no PHP a qualquer pipe que foi criado. O valor de retorno é um recurso representando o processo, você deve libera-lo usando proc_close() quando você tiver terminado com ela.

<?php
$descriptorspec
= array(
   
0 => array("pipe", "r"),  // stdin é um pipe a partir do qual o processo filho vai ler
   
1 => array("pipe", "w"),  // stdout é um pipe a partir do qual o processo filho vai escrever
   
2 => array("file", "/tmp/error-output.txt", "a") // stderr é um arquivo que será escrito
);
$process = proc_open("php", $descriptorspec, $pipes);
if (
is_resource($process)) {
    
// $pipes parece com isso agora:
    // 0 => manipulador de escrita conectado com o stdin do processo filho
    // 1 => manipulador de leitura conectado com o stdout do processo filho
    // Qualquer saída de erro será adicionada em /tmp/error-output.txt

    
fwrite($pipes[0], "<?php echo \"Hello World!\"; ?>");
    
fclose($pipes[0]);

    while(!
feof($pipes[1])) {
        echo
fgets($pipes[1], 1024);
    }
    
fclose($pipes[1]);
    
// É importante que você feche qualquer pipe antes de usar
    // proc_close para evitar um travamento
    
$return_value = proc_close($process);

    echo
"command returned $return_value\n";
}
?>

Os números de descritores em descriptorspec não saõ limitados a 0, 1 e 2 - você pode especificar qualquer número de descritor de arquivo válido e será passado para o processo filho. Isto permite ao seu script interagir com outros scripts que funcionam como "co-processos". Em particular, isto é útil para passar senhas para programas como PGP, GPG e openssl de uma maneira mais segura. É útil também para ler a informação de status provida por estes programas nos descritores de arquivos auxiliares.

Nota: Compatibilidade com o Windows: Descritores além do 2 (stderr) são disponibilizados para o Windows, mas desde que a arquitetura Windows não associa descritores de arquivos com os manipuladores de baixo nível, o processo filho não tem (ainda) meios de acessar estes manipuladores. Stdin, stdout e stderr funcionam como esperado.

Nota: Se você precisa de um pipe de processo uni-direcional, use a função popen() ao invés, já que ela é muito mais fácil de usar.

Veja também stream_select(), exec(), system(), passthru(), popen(), escapeshellcmd(), e o operador backtick.