我在Php里看到有header_sent这个函数,官方描述为检查http头是否已经被发出。这让我很好奇,也许我对TCP/IP那一套理解不够清楚,这个http协议每次响应,消息报头不应该和正文是一起响应的吗。
有人知道这个判断headers是否已发出该如何理解,有什么作用,又是如何实现的呢?
我在Php里看到有header_sent这个函数,官方描述为检查http头是否已经被发出。这让我很好奇,也许我对TCP/IP那一套理解不够清楚,这个http协议每次响应,消息报头不应该和正文是一起响应的吗。
有人知道这个判断headers是否已发出该如何理解,有什么作用,又是如何实现的呢?
7 回答2.4k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
2 回答3.1k 阅读✓ 已解决
4 回答1.5k 阅读
1 回答1.4k 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
换句话说,你在这段代码之前,有一些打印内容,但是这些内容是暂存在服务端的,并没有发给客户端,当你打印的内容超过 output_buffering 时,php 就会把前面的内容发送到客户端,又因为:
所以,这个方法的作用就是,当你发送的内容超过了 output_buffering 时或者调用了 ob_flush 方法时,其实已经有部分内容被发送到客户端了,所以这时候如果再直接调用 header 方法,就会报错,这时候你就可以用这个方法来检测,是否已经有结果发送出去了,如果有,就不再发送调用 header 方法发送 header 了,因为这样是没有意义的(还会导致报错)。
真的会有这种情况吗?
有的,这是一个很经典的问题,你是否注意过,当你使用 for 循环时,如果循环里面有 echo 和 sleep(3) ,可能你理想的是,浏览器每 3 秒打印一段内容?
实际上并非如此,除非超过了 output_buffering 或者 调用了 ob_flush 这些语句,否则,你的页面将会等待循环完成后,才会将所有内容一并发送到浏览器。
当然你可以通过 ob_flush 等方法控制每次循环的时候把打印的内容发送到浏览器,这样就达到了预期的效果,也就回到这个问题中来。
有的时候,不光要看手册,PHP 手册中,每个文档底部都有一些十分有用的「用户笔记」,而,在 header_sent 文档底部的用户笔记中,就有人解释了这些。