【问题标题】:PHP set proc_open to output directly to userPHP 设置 proc_open 直接输出给用户
【发布时间】:2013-02-18 04:44:08
【问题描述】:

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

【问题讨论】:

  • php.net/manual/en/function.stream-copy-to-stream.phpstream_copy_to_stream 似乎可以服务,其中目标流是用 fopen("php://output","w") 创建的 试图找到一种获取流长度的方法,可能不会但是有必要,必须测试它是否可以在没有设置内容长度的情况下显示在浏览器中。很抱歉评论时间过长,第一个评论不小心发布了,我被 RL 事件打断了,直到 5 分钟的编辑时期到期才能完成编辑。

标签: php stream pdftk proc-open


【解决方案1】:

由于没有人发布答案,所以我不妨发布我找到的答案。

使用 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多