コメントの投稿
- PHP proc_open で、はまる
マニュアルにある、サンプルでは
$process = proc_open('xxx', $descriptorspec, $pipes, $cwd, $env);
if (is_resource($process)) {
fwrite($pipes[0], $input_data);
fclose($pipes[0]);
$output_data = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$return_value = proc_close($process);
echo "command returned $return_value\n";
}
の様な感じに、なっている。
子プロセスによっては、これと同等では、動作しないことがある。
サンプルでは、子プロセスは、すべてのデータを受け入れたあと
出力する、プログラム(子プロセス)を対象にしているようだ。
プログラム(子プロセス)は、データ受け入れながら、データを出力する場合
パイプがいっぱいになり動作が止まることがある。
そのため、$input_dataを分割して、$output_dataを順次取り出す必要がある。
$process = proc_open('xxx', $descriptorspec, $pipes, $cwd, $env);
if (is_resource($process)) {
$output_data='';
stream_set_blocking($pipes[1], 0);
while($input_data!=''){
fwrite($pipes[0], substr($input_data,0,4096));
$input_data = substr($input_data,4096);
if(($tmp_data = stream_get_contents($pipes[1]))!==false){
$output_data.=$tmp_data;
}
}
fclose($pipes[0]);
stream_set_blocking($pipes[1], 1);
$output_data .= stream_get_contents($pipes[1]);
fclose($pipes[1]);
$return_value = proc_close($process);
echo "command returned $return_value\n";
}
投稿内容の公開方法は、ご指定のメールアドレスに記載しています。