<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >proc_open</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="Manual do PHP" HREF="index.html"><LINK REL="UP" TITLE="Programas, Funções de Execução" HREF="ref.exec.html"><LINK REL="PREVIOUS" TITLE="proc_nice" HREF="function.proc-nice.html"><LINK REL="NEXT" TITLE="proc_terminate" HREF="function.proc-terminate.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="refentry" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >Manual do PHP</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="function.proc-nice.html" ACCESSKEY="P" >Anterior</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="function.proc-terminate.html" ACCESSKEY="N" >Próxima</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><H1 ><A NAME="function.proc-open" ></A >proc_open</H1 ><DIV CLASS="refnamediv" ><A NAME="AEN184842" ></A ><P > (PHP 4 >= 4.3.0, PHP 5)</P >proc_open -- Executa um comando e abre ponteiros de arquivos para entrada/saída </DIV ><DIV CLASS="refsect1" ><A NAME="AEN184845" ></A ><H2 >Descrição</H2 >resource <B CLASS="methodname" >proc_open</B > ( string cmd, array descriptorspec, array pipes )<BR ></BR ><P > <B CLASS="function" >proc_open()</B > é similar a <A HREF="function.popen.html" ><B CLASS="function" >popen()</B ></A > mas provê um controle muito maior sobre a execução do programa. <CODE CLASS="parameter" >cmd</CODE > é o comando a ser executado pelo shell. <CODE CLASS="parameter" >descriptorspec</CODE > é 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. <CODE CLASS="parameter" >pipes</CODE > 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 <A HREF="function.proc-close.html" ><B CLASS="function" >proc_close()</B ></A > quando você tiver terminado com ela. </P ><P > <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN184867" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$descriptorspec </font><font color="#007700">= array(<br /> </font><font color="#0000BB">0 </font><font color="#007700">=> array(</font><font color="#DD0000">"pipe"</font><font color="#007700">, </font><font color="#DD0000">"r"</font><font color="#007700">), </font><font color="#FF8000">// stdin é um pipe a partir do qual o processo filho vai ler<br /> </font><font color="#0000BB">1 </font><font color="#007700">=> array(</font><font color="#DD0000">"pipe"</font><font color="#007700">, </font><font color="#DD0000">"w"</font><font color="#007700">), </font><font color="#FF8000">// stdout é um pipe a partir do qual o processo filho vai escrever<br /> </font><font color="#0000BB">2 </font><font color="#007700">=> array(</font><font color="#DD0000">"file"</font><font color="#007700">, </font><font color="#DD0000">"/tmp/error-output.txt"</font><font color="#007700">, </font><font color="#DD0000">"a"</font><font color="#007700">) </font><font color="#FF8000">// stderr é um arquivo que será escrito<br /></font><font color="#007700">);<br /></font><font color="#0000BB">$process </font><font color="#007700">= </font><font color="#0000BB">proc_open</font><font color="#007700">(</font><font color="#DD0000">"php"</font><font color="#007700">, </font><font color="#0000BB">$descriptorspec</font><font color="#007700">, </font><font color="#0000BB">$pipes</font><font color="#007700">);<br />if (</font><font color="#0000BB">is_resource</font><font color="#007700">(</font><font color="#0000BB">$process</font><font color="#007700">)) {<br /> </font><font color="#FF8000">// $pipes parece com isso agora:<br /> // 0 => manipulador de escrita conectado com o stdin do processo filho<br /> // 1 => manipulador de leitura conectado com o stdout do processo filho<br /> // Qualquer saída de erro será adicionada em /tmp/error-output.txt<br /><br /> </font><font color="#0000BB">fwrite</font><font color="#007700">(</font><font color="#0000BB">$pipes</font><font color="#007700">[</font><font color="#0000BB">0</font><font color="#007700">], </font><font color="#DD0000">"<?php echo \"Hello World!\"; ?>"</font><font color="#007700">);<br /> </font><font color="#0000BB">fclose</font><font color="#007700">(</font><font color="#0000BB">$pipes</font><font color="#007700">[</font><font color="#0000BB">0</font><font color="#007700">]);<br /><br /> while (!</font><font color="#0000BB">feof</font><font color="#007700">(</font><font color="#0000BB">$pipes</font><font color="#007700">[</font><font color="#0000BB">1</font><font color="#007700">])) {<br /> echo </font><font color="#0000BB">fgets</font><font color="#007700">(</font><font color="#0000BB">$pipes</font><font color="#007700">[</font><font color="#0000BB">1</font><font color="#007700">], </font><font color="#0000BB">1024</font><font color="#007700">);<br /> }<br /> </font><font color="#0000BB">fclose</font><font color="#007700">(</font><font color="#0000BB">$pipes</font><font color="#007700">[</font><font color="#0000BB">1</font><font color="#007700">]);<br /> </font><font color="#FF8000">// É importante que você feche qualquer pipe antes de usar<br /> // proc_close para evitar um travamento<br /> </font><font color="#0000BB">$return_value </font><font color="#007700">= </font><font color="#0000BB">proc_close</font><font color="#007700">(</font><font color="#0000BB">$process</font><font color="#007700">);<br /><br /> echo </font><font color="#DD0000">"command returned $return_value</font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV > </P ><P > O PHP 5RC2 introduz suporte pty para sistemas com Unix98 ptys. Isto permite ao seu script interagir com aplicações que esperão estar conversando com um terminal. Um pty funciona como um pipe, mas é bi-direcional, então não é necessário especificar um modo de leitura/escrita. O exemplo abaixo mostra como usar um pty; note que você não precisa ter todos os descritores conversando com um pty. Note também que apenas um pty é criado, mesmo que o pty seja especificado 3 vezes. Em versões futuras do PHP, será possível fazer mais do que apenas ler e escrever para o pty. </P ><P > <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN184871" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#FF8000">// Cria um pseudo terminal para o processo filho<br /></font><font color="#0000BB">$descriptorspec </font><font color="#007700">= array(<br /> </font><font color="#0000BB">0 </font><font color="#007700">=> array(</font><font color="#DD0000">"pty"</font><font color="#007700">),<br /> </font><font color="#0000BB">1 </font><font color="#007700">=> array(</font><font color="#DD0000">"pty"</font><font color="#007700">),<br /> </font><font color="#0000BB">2 </font><font color="#007700">=> array(</font><font color="#DD0000">"pty"</font><font color="#007700">)<br />);<br /></font><font color="#0000BB">$process </font><font color="#007700">= </font><font color="#0000BB">proc_open</font><font color="#007700">(</font><font color="#DD0000">"cvs -d:pserver:cvsread@cvs.php.net:/repository login"</font><font color="#007700">, </font><font color="#0000BB">$descriptorspec</font><font color="#007700">, </font><font color="#0000BB">$pipes</font><font color="#007700">);<br />if (</font><font color="#0000BB">is_resource</font><font color="#007700">(</font><font color="#0000BB">$process</font><font color="#007700">)) {<br /> </font><font color="#FF8000">// work with it here<br /></font><font color="#007700">}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV > </P ><P > Os números de descritores em <CODE CLASS="parameter" >descriptorspec</CODE > 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. </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > 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. </P ></BLOCKQUOTE ></DIV ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > Se você precisa de um pipe de processo uni-direcional, use a função <A HREF="function.popen.html" ><B CLASS="function" >popen()</B ></A > ao invés, já que ela é muito mais fácil de usar. </P ></BLOCKQUOTE ></DIV ><P > Veja também <A HREF="function.stream-select.html" ><B CLASS="function" >stream_select()</B ></A >, <A HREF="function.exec.html" ><B CLASS="function" >exec()</B ></A >, <A HREF="function.system.html" ><B CLASS="function" >system()</B ></A >, <A HREF="function.passthru.html" ><B CLASS="function" >passthru()</B ></A >, <A HREF="function.popen.html" ><B CLASS="function" >popen()</B ></A >, <A HREF="function.escapeshellcmd.html" ><B CLASS="function" >escapeshellcmd()</B ></A >, e o operador <A HREF="language.operators.execution.html" >backtick</A >. </P ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="function.proc-nice.html" ACCESSKEY="P" >Anterior</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >Principal</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="function.proc-terminate.html" ACCESSKEY="N" >Próxima</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >proc_nice</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="ref.exec.html" ACCESSKEY="U" >Acima</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >proc_terminate</TD ></TR ></TABLE ></DIV ></BODY ></HTML >