proc_open

(PHP 4 >= 4.3.0, PHP 5)

proc_open --  コマンドを実行し、入出力用にファイルポインタを開く

Description

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

proc_open()popen() と よく似ていますが、プログラムの実行をさらに細かく制御できる点で違います。 cmd は、シェルによって実行されるコマンドです。 descriptorspec は、キーがディスクリプタの番号で、 値がどのようにディスクリプタを子プロセスに渡すかを示す配列です。 pipes は、生成された、PHP 側のパイプの終端にあたる ファイルポインタを格納した配列にセットされます。 返値はプロセスを表すリソースです。処理が終わったら、 proc_close() を使ってリソースを開放しなくては いけません。

$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to
);
$process = proc_open("php", $descriptorspec, $pipes);
if (is_resource($process)) {
    // $pipes はこの時点で次のような形を取っている
    // 0 => 子プロセスの stdin に繋がれた書き込み可能なハンドル
    // 1 => 子プロセスの stdout に繋がれた読み込み可能なハンドル
    // すべてのエラー出力は /tmp/error-output.txt に書き込みされます。

    fwrite($pipes[0], "<?php echo Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /home/derick/phpdoc-all/scripts/html_syntax.php on line 38 "Hello World!\"; ?>");
    
fclose($pipes[0]);

    while(!
feof($pipes[1])) {
        echo
fgets($pipes[1], 1024);
    }
    
fclose($pipes[1]);
    
// デッドロックを避けるため proc_close を呼ぶ前に、
    // すべてのパイプを閉じることが重要です。
    
$return_value = proc_close($process);

    echo
"command returned $return_value\n";
}

descriptorspec における ファイルディスクリプタの番号は、特に 0, 1, 2 に限られているわけでは ありません。有効であるどのようなファイルディスクリプタの番号も指定でき、 それは子プロセスに渡されます。これにより、あるスクリプトと、 子プロセスとして起動している別のスクリプトとの間で通信ができます。 特に、これは PGP や GPG、openssl といったプログラムにパスフレーズを より安全な方法で渡したいとき威力を発揮します。 補助的なファイルディスクリプタを介して、そのようなプログラムの 状態を取得するのにも便利です。

注意: Windows における互換性: 2 (stderr) よりも大きな番号のディスクリプタは 子プロセスに継承可能なハンドルとして渡されますが、 Windows のアーキテクチャは、ファイルディスクリプタの番号と より低レベルなハンドルを関連付けないので、子プロセスは、 それらのハンドルにアクセスする術を持ちません。stdin, stdout, stderr は期待通り動きます。

注意: この関数は PHP 4.3.0 で導入されました。

注意: もし一方向のパイプを利用したいだけでしたら、 popen() を使うほうがより簡単です。

exec(), system(), passthru(), popen(), escapeshellcmd(), backtick operator も参照下さい。