2014-01-30 46 views
0

我正在開發一個將與其他PHP腳本一起使用的PHP腳本。我的腳本將文件推送到瀏覽器進行下載,因此需要緩衝區清潔並且不發送標題。防止ob_end_clean()發送頭文件?

現在,假設輸出緩衝區包含一個字符「a」,並且頭文件尚未發送。我正在嘗試擺脫緩衝區內容的方法是使用ob_end_clean()完全清空緩衝區。這工作,然而,這發出的頭,我不知道如何防止這種情況:

var_dump(headers_sent()); // false 
ob_end_clean(); 
var_dump(headers_sent()); // true 

如何獲得不發送頭去掉緩衝區的內容?

UPDATE:

有報道說,被送到我的var_dump()導致頭部的擔憂。這裏的另一個測試:

$sent_a = headers_sent(); 
ob_end_clean(); // or ob_clean(); etc.. 
$sent_b = headers_sent(); 
var_dump($sent_a); 
var_dump($sent_b); 
exit; 

結果:

bool(false) bool(true) 
+1

如果我叫'ob_start我無法重現這個問題( )'在代碼之前(第一個'var_dump'被丟棄,第二個正確地聲明'false')。你有一個'ob_start()'嗎? – Wrikken

+0

如前所述,還有一些其他腳本(我無法控制它們)在輸出緩衝區中留下一些內容。我正在用ob_get_contents()來檢查它。我正在開發一個WordPress插件,並希望使它更加失敗(或者如果您願意的話,可以很簡單)。 – sPaul

+0

任何其他代碼可以根據需要結束/刷新緩衝區,如果您不信任它們,那麼您可以做的事情很少。我_can_告訴你'ob_get_clean()'不會發送頭文件。期。如果標題_已發送,它已在另一個地方完成(並且'headers_sent()'可以告訴你_where_)。 – Wrikken

回答

0

ob_end_clean()清除緩衝器和輸出緩衝的匝數,因此標頭將被髮送。 使用ob_get_clean()來清除緩衝區。

var_dump(headers_sent()); // false 
ob_get_clean(); 
var_dump(headers_sent()); //Should be false still and buffer should be empty 
0

不知道你想要做什麼用,但php.net的ob_end_clean()頁面上first comment有一個可能的解決方案:

<?php 
    // code 

    $headers = array(); 
    if (!headers_sent()) { 
     $headers = apache_response_headers(); 
    } 

    ob_end_clean(); 
    ob_start(); 

    if (!empty($headers)) { 
     foreach ($headers as $name => $value) { 
     header("$name: $value"); 
     } 
    } 

    // more code 
?>