我正在开发一个将与其他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)
答案 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
?>