PHP将proc_open设置为直接输出给用户

时间:2013-02-18 04:44:08

标签: php stream pdftk proc-open

我正在使用proc_open和pdftk来预先填充一些带有数据的表单,这很好用,但是不是将结果保存到文件然后再读取文件,我想直接打印出来的文件。我有这个工作所以我没有任何问题。但我想直接将proc_open的输出定向到返回给用户的流,这样我就不必在php中保存内存中的值。到目前为止,我有以下内容:

$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。如果有人知道直接打印流的功能,是否还有一种方法可以获取流的字节长度而无需实际读取它。

1 个答案:

答案 0 :(得分:3)

由于没有人发布答案,我也可以发布我找到的答案。

使用fopen模式w打开到php://输出的流,并使用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);
}
相关问题