PHP设置proc_open直接输出给用户

aiqt4smr  于 2023-05-05  发布在  PHP
关注(0)|答案(2)|浏览(151)

我正在使用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。如果有人知道直接输出流的函数,是否也有一种方法可以获得流的字节长度,而无需实际阅读。

frebpwbc

frebpwbc1#

既然没有人发布答案,我不妨发布我找到的答案。
使用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);
}
uplii1fm

uplii1fm2#

医生说:
descriptor_spec:
...
每个元素可以是:

  • 描述要传递给进程的管道的数组。第一个元素是描述符类型,第二个元素是给定类型的选项。有效的类型是pipe(第二个元素是r,将管道的读端传递给进程,或者是w,将写端传递给进程)和file(第二个元素是文件名)。请注意,除w之外的任何内容都被视为r。
  • 表示真实的文件描述符的流资源(例如打开的文件、套接字、STDIN)。

因此,您可以用途:

$descriptors = [
    1 => \fopen('php://stdout', 'w'),
    2 => ['pipe', 'w'],
];

相关问题