3

私は pdftk で proc_open を使用していくつかのフォームにデータを事前入力していますが、これはかなりうまく機能しますが、結果をファイルに保存してからファイルを読み戻すのではなく、ファイルを直接印刷したいと思います。私はこれで動作しているので、問題はありません。しかし、php のメモリに値を保持する必要がないように、proc_open の出力をユーザーに返されるストリームに直接送りたいと思います。これまでのところ、次のものがあります。

$descriptorspec = array(
0 => array("pipe","r"),
1 => array("pipe","w"),
2 => array("file","error.txt","a") );
$process = proc_open($command, $descriptorspec, $pipes);
if( is_resource( $process ) ) {
  fwrite($pipes[0], $fdf);
  fclose($pipes[0]);
  echo stream_get_contents($pipes[1]));
  fclose($pipes[1]);
  proc_close($process);
}

上記のコードで得られるように、実際に値を変数に保存してから出力することなく、結果を直接使用できるようにしたいと思います。PHPの出力のストリームを直接出力に向ける方法はありますか? メモリを節約し、コードの実行にかかる時間を短縮するためにこれを行いたいと思います。

ストリームの結果を直接出力するphpのストリームの関数を知っている人はいますか。または、これを行う proc_open の設定があります。いずれにせよ、PDF を直接表示するには出力に content-length ヘッダーを追加する必要があるため、これがまったく機能しないのではないかと心配しています。ストリームを直接出力する機能を知っている人がいる場合、実際に読み込まずにストリームのバイト長を取得する方法もあります。

4

1 に答える 1

3

誰も回答を投稿していないので、私が見つけた回答を投稿することもできます。

fopen モード w で php://output へのストリームを開き、stream_copy_to_stream を使用して proc_open プロセスからユーザーに直接データを送信します。ただし、ストリーム内のデータの長さやサイズを取得する簡単な方法はないようです。

$descriptorspec = array(
0 => array("pipe","r"),
1 => array("pipe","w"),
2 => array("file","error.txt","a") );
$process = proc_open($command, $descriptorspec, $pipes);
if( is_resource( $process ) ) {
  fwrite($pipes[0], $fdf);
  fclose($pipes[0]);

  /* New Code */  
  if( $fout = fopen("php://output","w") ) {
    stream_copy_to_stream($pipes[1],$fout);
    fclose($fout);
  }  

  fclose($pipes[1]);
  $result = proc_close($process);
}
于 2013-02-19T00:55:01.033 に答える