3

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

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

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 回答