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


php flush() triggers headers_sent() even without content

php的headers_sent()函数在我的目标服务器上不起作用。它的值不会为True,即使是回显。这可以通过更改php.ini中的output_buffering值来修复,但不幸的是我没有访问权限。在这个stackoverflow问题中提到的一个解决方法是使用flush()函数。

然而,当使用flush()时,headers_sent()函数的计算结果总是True。这是因为正如lafor指出的那样,flush()将发送header + content(如果有的话)。

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

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

谁能帮我检查一下之前是否有输出?

(额外的上下文:我想检查是否有任何函数在执行时间早些时候echo()一些警告消息,当然这些函数也可以/应该做一些更复杂的错误报告,但那是另一回事)

你这样做的目的是什么?再多解释一下也许能帮助我们把它放在上下文中。

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

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

当输出缓冲打开时,在输出刷新之前不会发送报头,因此headers_sent()在之前返回false 这是正确的。flush()刷新所有缓冲内容(如果有的话)标题,因此headers_sent()返回true之后也是正确的。我不明白为什么这个函数"不工作"或"无用"。

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