PHP输出缓冲控制

时间:2015-04-20 19:15:53

标签: php buffer

我有一系列物品。有两种“类型”或项目:标题行和常规行。我想打印标题只有当它下面有任何“常规”行时(在下一个标题之前)。

(这是一种简化 - 实际上我无法查看当前迭代中的下一项)。

为了解决这个问题,我使用了缓冲控制。我清除并在每个标题行启动缓冲区,并在每个常规行中刷新缓冲区。因此,如果标题后面有一个标题(缓冲区将被清理),标题将不会打印,如果有一个常规行来“冲洗”它将被刷新给用户。

(psudeo代码)

for i in array:
     if i is heading:
          ob_end_clean();
          ob_start();
          echo "header $i";
     else:
          ob_end_flush();
          echo "regular $i"

这很有效。

问题是,我可以选择以PDF格式下载页面,这打破了它。它的工作方式是,如果pdf标志打开,则在页面顶部启动缓冲区,在代码的底部,缓冲区被转储到变量中并作为字符串发送到pdf api。现在,缓冲区通过ob_end_flush()发送给用户,当我尝试下载pdf时会产生此错误:

cannot modify header information - headers already sent.

我喜欢我的解决方案,但有没有办法让它发挥作用?或者从一开始就是一个糟糕的解决方案?感谢

2 个答案:

答案 0 :(得分:0)

而不是输出到缓冲区output to a file buffer instead。然后只发送整个文件(这有点棘手但如果你正确管理重定向它应该工作正常):

伪码:

for i in array:
     if i is heading:
          // output to file buffer
          echo "header $i";
     else:
          // stop output to file buffer
          echo "regular $i"

答案 1 :(得分:0)

我的建议是,即使您无法查看 next 项,我认为您可以跟踪上一个项。我认为无论你的输出方法如何,这都应该有用。

$previous = '';
foreach ($rows as $row) {
    if ($row == 'header') {
        // Wait to print header rows depending on what the next row is.
        $previous = $row;
    } else {
        // For regular rows, print the preceding header row (if there is one.)
        echo $previous;
        echo $row; // Print the regular row.
        $previous = ''; // Then clear the saved header row.
    }
}