阻止ob_end_clean()发送标头?

时间:2014-01-30 15:09:19

标签: php http-headers

我正在开发一个将与其他PHP脚本一起使用的PHP脚本。我的脚本将文件推送到浏览器进行下载,因此需要缓冲区清理并且不发送标头。

现在,假设输出缓冲区包含字符“a”,并且尚未发送标题。我想要摆脱缓冲区内容的方法是使用ob_end_clean()完全清空缓冲区。但是,这可以发送标题,我不知道如何防止这种情况:

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

如何在不发送标题的情况下摆脱缓冲区内容?

更新

有人担心我的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)

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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
?>