在看了一些博文以后,发现大多数博文并不能解决我的问题,他们的重点都是放在对输出缓冲器的一些操作上面,而并没有真正提到“为什么header前不能有输出?”或者讲的都很模糊,下面我们来看看究竟是为什么。
那我们也得先来聊聊缓冲吧。
buffer是啥?全名叫缓冲寄存器,存储速度较快。主要分为输入缓冲器和输出缓冲器两种。
输入缓冲器:将外设送来的数据暂时存放,以便处理器将它取走。我们都知道,处理器的速度很快,外设较慢,如果没有缓冲器的话,cpu将有大部分时间在等待外设数据,简直很浪费时间嘛!这里暂且不说cpu利用这段时间去干点别的什么。
输出缓冲器:暂存处理器送往外设的数据。如果没有它,cpu处理完数据就交付,cpu的快速和外设的慢速,cpu不可能等着外设在那慢慢消化,这样容易造成数据覆盖,以致丢失。
总的一点:缓冲器的提出,主要是为了应对高速cpu与外设协调工作,实现数据同步与安全。
好了,不吹水了,赶紧步入正题。
分析如下:
但在这之前,我先来点废话,在当今的网络通信中,不管是B/S还是C/S,HTTP 1.1说明,一次通信,建立一次tcp持久连接,在该连接中可以发送多次资源请求,每次请求对应一次请求头消息的发送,服务端对应一次响应头消息和资源主体(如果存在)的返回。(服务端正直到既不多给也不少给)。
ok了,不扯淡了。
大伙都知道,客户端之所以会收到资源,是因为它是主动请求的,服务端被动发送给它。
我们来假设一下:假如header前面可以有实际的输出,output_buffer=off,我们看看会发生什么。
好了,客户端发送一次资源请求,请求如下一页面。
<html>asdf</html>
<?php
header(‘Location : http://segmentfault.com/‘);
?>
服务端返回一个响应头部(
浏览器接收
)说云云,浏览器开始解析(当然php并不由浏览器解析,但这并不影响我们的理解)该页面,首先显示asdf,不错吧,好,再往下走,碰到header,它会说泥煤啊,这header的信息应该和响应头部一起送过来啊,我都已经接收到一个响应头部了,并且连信息都输出了(asdf),现在又
需要再接收一个头部
才行啊,是啊,但是我只请求了一次啊,也就是我只发送了一个请求头部啊,怎么能接收两个呢,不行,不能花心,只能接收一个,这个不能接收。其实到这里我们已经发现,浏览器就跟做人一样,专一才是王道。它发送一次请求就只能接收一个响应头信息。