即使没有内容,php flush()也会触发headers_sent()

时间:2014-03-18 13:42:00

标签: php

php的headers_sent()函数在我的目标服务器上不起作用。即使事情得到回应,它也不会评估为True。这可以通过更改php.ini中的output_buffering值来修复,但遗憾的是我没有访问权限。此stackoverflow question中提到的解决方法是使用flush()函数。

但是当使用flush()时,headers_sent()函数总是计算为True。这是因为flush()会发送标题+内容(如果有的话)作为lafor指出。

<?php
flush();
if(headers_sent())
    echo 'headers were sent';
//will output 'headers were sent'

我想使用headers_sent()函数来检查是否已经写入/输出了任何内容。 标题本身对我来说并不重要。

任何人都可以帮我检查一下是否有更早的输出吗?

(额外的上下文:我想在执行时间的早期检查是否有任何函数回显()一些警告消息,当然这些函数可能/应该做一些更复杂的错误报告,但这是一个不同的故事)

3 个答案:

答案 0 :(得分:1)

你这样做的目的是什么?更多的解释可能有助于我们将其置于背景中。

如果需要输出缓冲,可以跳过php.ini函数并使用ob_start();和像ob_get_clean()这样的函数;返回内容而不输出。

答案 1 :(得分:0)

http://us1.php.net/flush描述了许多情况,其中缓冲可能导致输出在预期时发送。另见http://www.tuxradar.com/practicalphp/13/9/0#null。 flush()函数应该发送&#34;所有内容&#34;到浏览器,其中包括HTTP标头。但是,即使没有其他输出,我也不清楚读取标题是否已发送。根据您报告的经验,我猜测至少对于您的服务器(可能是浏览器),无论是否有其他输出,标题都会刷新。

答案 2 :(得分:0)

当输出缓冲打开时,在刷新输出之前不会发送标头,因此headers_sent()在之前返回false 是正确的。 flush()刷新所有缓冲内容(如果有)标头,因此headers_sent()之后返回true也是正确的。我不知道该功能是如何“不工作”或“无用”。

如果你的目的是检查是否有设置为发送(使用header()函数,没有输出缓冲,也会立即发送标题),你可能会想要查看headers_list()或使用header_register_callback()注册自定义回调。