簡體   English   中英

PHP輸出緩沖區控制

[英]PHP output buffer control

我有一系列物品。 有兩種“類型”或項目:標題行和常規行。 我只想在標題下有任何“常規”行時打印標題(在下一個標題之前)。

(這是一種簡化-實際上,我將無法查看當前迭代中的下一項)。

為了解決這個問題,我使用了緩沖區控制。 我在每個標題行清除並啟動緩沖區,然后在每個常規行中刷新緩沖區。 因此,如果標題后面沒有標題,則不會打印該標題(緩沖區將被清除),如果有常規行可以將其刷新,則該標題將被刷新。

(偽代碼)

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.

我喜歡我的解決方案,但是有辦法使它起作用嗎? 還是從一開始就是一個不好的解決方案? 謝謝

而不是輸出到緩沖區,而是輸出到文件緩沖區 然后,僅發送整個文件(這有點棘手,但是如果正確管理重定向,它應該可以正常工作):

偽代碼:

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

我的建議是,即使您看不到一項,我認為您也可以跟蹤一項。 我認為無論您使用哪種輸出方法,這都應該有效。

$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.
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM