headers_sent这个函数是怎么个意思

我在Php里看到有header_sent这个函数,官方描述为检查http头是否已经被发出。这让我很好奇,也许我对TCP/IP那一套理解不够清楚,这个http协议每次响应,消息报头不应该和正文是一起响应的吗。

有人知道这个判断headers是否已发出该如何理解,有什么作用,又是如何实现的呢?

阅读 1.7k
1 个回答
你所有需要输出到浏览器的数据将会一直缓存在服务器端,直到你发送他们,这将造成比较大的资源开销。你可以是用输出缓冲来避开这个问题。你可以通过在脚本里使用ob_start()和ob_end_flush()或者直接在你的php.ini文件里设置output_buffering,也可以直接在服务器的配置文件里设置。

换句话说,你在这段代码之前,有一些打印内容,但是这些内容是暂存在服务端的,并没有发给客户端,当你打印的内容超过 output_buffering 时,php 就会把前面的内容发送到客户端,又因为:

请注意 header() 必须在任何实际输出之前调用,不管是普通的 HTML 标签,还是文件或 PHP 输出的空行,空格。这是个常见的错误,在通过include,require,或者其访问其他文件里面的函数的时候,如果在header()被调用之前,其中有空格或者空行。 同样的问题也存在于单独的 PHP/HTML 文件中。

所以,这个方法的作用就是,当你发送的内容超过了 output_buffering 时或者调用了 ob_flush 方法时,其实已经有部分内容被发送到客户端了,所以这时候如果再直接调用 header 方法,就会报错,这时候你就可以用这个方法来检测,是否已经有结果发送出去了,如果有,就不再发送调用 header 方法发送 header 了,因为这样是没有意义的(还会导致报错)。

真的会有这种情况吗?

有的,这是一个很经典的问题,你是否注意过,当你使用 for 循环时,如果循环里面有 echo 和 sleep(3) ,可能你理想的是,浏览器每 3 秒打印一段内容?

实际上并非如此,除非超过了 output_buffering 或者 调用了 ob_flush 这些语句,否则,你的页面将会等待循环完成后,才会将所有内容一并发送到浏览器。

当然你可以通过 ob_flush 等方法控制每次循环的时候把打印的内容发送到浏览器,这样就达到了预期的效果,也就回到这个问题中来。

有的时候,不光要看手册,PHP 手册中,每个文档底部都有一些十分有用的「用户笔记」,而,在 header_sent 文档底部的用户笔记中,就有人解释了这些。

推荐问题
宣传栏