有关header()前不能有实际输出的一点分析

在看了一些博文以后,发现大多数博文并不能解决我的问题,他们的重点都是放在对输出缓冲器的一些操作上面,而并没有真正提到“为什么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),现在又需要再接收一个头部才行啊,是啊,但是我只请求了一次啊,也就是我只发送了一个请求头部啊,怎么能接收两个呢,不行,不能花心,只能接收一个,这个不能接收。其实到这里我们已经发现,浏览器就跟做人一样,专一才是王道。它发送一次请求就只能接收一个响应头信息。

时间: 2024-10-05 15:05:33

有关header()前不能有实际输出的一点分析的相关文章

【问题】做图片验证码时乱码了,在header前加上ob_clean()就能神奇的显示?!

源代码如下: 1 <?php 2 //图片验证码 3 // 该方法必须处于脚本最顶部 4 session_start(); 5 // 验证码图片和对应的验证值的对应关系 6 $table = array( 7 'pic0' => '博美', 8 'pic1' => '仓鼠', 9 'pic2' => '萨摩', 10 'pic3' => '泰迪', 11 ); 12 13 $index = rand(0,3); 14 15 $value = $table['pic'.$ind

如何在MySQL中实现组内前几名的输出

关于问题 如何查询组内最大的,最小的,大家或许都知道,无非是min.max的函数使用.可是如何在MySQL中查找组内最好的前两个,或者前三个? 什么是相关子查询 在提出对于这个问题的对应方法之前,首先来理解一个概念:相关子查询. 所谓相关子查询,就是其查询的执行依赖于外部查询.多数情况下是子查询的where子句中引用了外部查询的表.执行过程: 从外层查询中取出一个元组,将元组相关列的值传给内层查询 执行内层查询,得到子查询操作的值 外查询根据子查询返回的结果或结果集得到满足条件的行 然后外层查询

shell 脚本 变量 获取程序输出结果异常分析

#! /bin/bash pid=$(pgrep hello) echo ${pid} 脚本名称是 hello_test.sh 当hello进程存在时,总是返回两个值 当hello进程不存在时,返回值并不为空,总是返回一个值,多次运行,返回的值并不固定 当然,以上都不是期望的结果. 为什么不存在时,也会返回呢,并且返回值不一样,记得好像有一个内部变量记得上次shell进程的pid, 应该是这样. 经人提醒,脚本是不是也是hello.sh,终于恍然醒悟,脚本名是hello_test.sh,也包含h

xargs 重定向输出 示列分析

xarge参数的意义,请自行搜索. abc.txt 文件内容如下: /home/wufa/num_file1 /home/wufa/num_file2 其中num_file1和num_file2每行包括一个数字 cat abc.txt | xargs -i -n 1 -P 20 sh -c "grep "23" {} > {}.log " 从abc.txt 中每次读取一行,作为grep的参数,由{} 替代. 并将读取后匹配的数字内容,生成大小为0字节的 数字.

JAVA异常处理原则和log4j输出详细异常分析

1.多用try,catch;不要一个try,catch包含所有内容 好处:不同模块抓取不同异常,某一模块异常挂了,不影响其他模块的程序的进行 2.多写几个catche:尽量不要使用Exception这个大异常去包容所有异常 不要为了追求代码的简练,try,catch只写一个,使用Exception去抓取所有可能的异常,这只是理想状态,程序出错不是直接打印出来异常就完事了,应该在catche抓取异常的同时一方面给程序员输出错误日志,一方面做些处理反馈给用户,比如一些提示错误框或者错误页面,不能让用

十三、MapReduce--output输出源码分析

当reducetask执行完成后,就会将结果的KV写入到指定路径下.下面分析这个output过程. 1.首先看 ReduceTask.run() 这个执行入口 //--------------------------ReduceTask.java public void run(JobConf job, TaskUmbilicalProtocol umbilical) throws IOException, InterruptedException, ClassNotFoundException

微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧

案例背景与需求介绍 之前做过一个美国的医疗保险的项目,保险提供商有大量的文件需要发送给比如像银行,医疗协会,第三方服务商等.比如像与银行交互的 ACH 文件,传送给协会的 ACH Credit 等文件.这些文件格式在美国都是开放的,通用的,可以直接到相关网站下载.也就是说像银行,协会等他们接受这种固定格式的文件,读取数据,读取公司编号进行业务来往或者记录.我当时就是直接在网上搜索到一个 PDF 格式的文件说明,大概有10来页,就是告诉你这个格式是如何定义,应该如何来处理的. 那么这种文件并非像我

header(&quot;location:&quot;)总结

header("Location:login.php")应该注意的几个问题 header("Location:")作为php的转向语句.其实在使用中,他有几点需要注意的地方. 1.要求header前没有任何输出 2.在header("Location:")后要及时exit

PHP 页面编码声明方法详解(header或meta)(转)

编码格式有两种,一种是php文件本身的编码格式,如 editplus之类的编辑器在保存文件的时候允许你指定文件编码格式:另一种是php输出的文本的编码格式,这个信息只对浏览器生效,方法为<?php header('charset: utf-8;');?>.需要注意的是header方法必须在任意输出之前调用.通常,PHP项目开发工具,如ZendStudio, PHPStorm等都是设置项目的编码方式的,保证项目中的所有文件使用相同格式的编码.而对于WEB输出,通常的方式是在html文件中使用&l