php的header()函数前有echo输出情况分析

  php的header()方法一般被用来告知浏览器做一些什么样的操作,比如跳转,刷新等等;而调用header方法前,如果使用echo输出一些内容,会发生什么情况呢?会对header函数有影响吗?我们实验来看看情况。

第一部分: 选择环境和版本

  我们的测试选择的是LNNP,php的版本是5.3.8,相对较老的版本

  

第二部分:测试用例

<?php

$str  = "qwertyuiopasdfghjklzxcvbnm1234567890~!@#$%^&*()_+";

$time = 10;
for ($i = 0; $i < $time; $i ++){
  $x = rand(0, 40);
  $v = substr($str, $x, 1);
  echo $v;
}

header(‘Refresh:3, http://www.baidu.com‘); 

解释一下这个测试用例,

1、$time变量用来控制echo输出字符的大小

2、为什么用for循环输出乱序的字符?原因从第三部分抓包的情况可以看到,浏览器端一般要求response内容部分进行gzip压缩。而这个压缩实际上是php做的,为排除gzip压缩对实验影响,所以用for循环做乱序输出

第三部分:抓包分析

 1、正常情况,$time变量比较小的情况下

  1) 浏览器发送请求给Nginx

 

  

  2) nginx将请求包装后发送给php-fpm 

  

  3) php-fpm将结果回传nginx

  4) nginx将结果回传浏览器

 

2、异常情况,$time变量较大的情况下
    我们看1中第三步,php-fpm将结果回传nginx,我们发现两点
    1) 无法实现跳转。  从抓包的情况是php无法修改输出header头的信息,其原因应该是header信息,已经被write到socket fd中,缓存池中不存在header信息,所以无法修改
    2) echo输出的内容无影响。

第四部分:分析和结论

结合上面的情况,从第三部分的第一点,我们实际上可以看出,header函数的实现,实际上是把header函数的参数,作为字符串加到输出的返回内容 的header头部分,而在echo内容较大的时候,header头的字符串就无法输出了。

   我们可以看出php的处理过程    echo 的内容都会被放到缓存池内,当缓存池满的时候, 会将缓存池的内容write到socket fd内,一旦write进去,header函数将无法再把header字符串写到返回请求的header头部分。所以这种情况下,header函数将失效。

时间: 2024-11-09 00:37:38

php的header()函数前有echo输出情况分析的相关文章

PHP header() session_start() 函数前不能有输出,为什么?

前阵面试遇到的问题,当时没答上来,后来查了些资料,仍未得到答案.今天研究HTTP请求,终于知道了答案. HTTP 函数允许在其他输出被发送之前,对由 Web 服务器发送到浏览器的信息进行操作. HTTP请求和HTTP响应都有消息报头.而消息报头是由众多报头域组成. 也就是设置请求的消息报头,再发送:若之前有输出,就先以默认请求发送了,消息报头已确定,后面的设置就失效. 参考:PHP HTTP函数 HTTP协议详解(五.消息报头) 粗略认识,如有错误请指正.

php header函数

Header()函数—is used to send raw HTTP headers. 1. 重定向 <?php header(“Location: http://www.jb51.net”;); exit; //在每个重定向之后都必须加上”exit”,避免发生错误,继续执行. ?> <?php header(“refresh: 2;url=http://www.jb51.net”;); echo ”正在加载,请稍等…<br/> 三秒后自动跳转值<a href=”ht

http标头详解/即php中header函数应用解释

HTTP协议header标头详解 分类: Webkit Web Php C/C++ 2012-10-31 11:19 14366人阅读 评论(0) 收藏 举报 本文根据RFC2616(HTTP/1.1规范),参考 http://www.w3.org/Protocols/rfc2068/rfc2068 http://www.w3.org/Protocols/rfc2616/rfc2616 http://www.ietf.org/rfc/rfc3229.txt 通常HTTP消息包括客户机向服务器的请

php header函数的详解

header函数在php中是发送一些头部信息的, 我们可以直接使用它来做301跳转等,下面我来总结关于header函数用法与一些常用见问题解决方法. 发送一个原始 HTTP 标头[Http Header]到客户端.标头 (header) 是服务器以 HTTP 协义传 HTML 资料到浏览器前所送出的字串,在标头与 HTML 文件之间尚需空一行分隔. 1.重定向. Header("Location: http://blog.anepx.com"); exit; //在每个重定向之后都必须

PHP函数前面的@。

@是可以屏蔽函数执行过程中遇到问题而产生的一些错误.警告信息,这样用户就看不到程序的出错信息.这样除了用户界面会友好一些外,更重要的是安全性,因为屏蔽了出错文件的路径等信息. 比如说这个: for($i = 0;$i<$to;$i++){ $result = fsockopen($target, $i, $errno, $errstr, 1); if(!$result) echo "Port $i Closed...".'<br>'; else "Socke

php中函数前加&amp;符号的作用分解

这篇文章主要介绍了php中的函数前加&符号的作用分解,其作用叫做引用返回,有点抽象,详细解释请看本文内容,需要的朋友可以参考下  (转载) php变量前面加&符号是什么意思就不用多说了,大家都在用,就是两个变量同时指向一个地址而已,那么,php函数前面加&符号的意义又是什么呢?下面先上两个演示代码,然后再做解释. function &chhua() { static $b = "www.jb51.net"; //申明一个静态变量 $b = $b . &q

php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证及缺点

在php中,可以使用Header函数做一些有趣的事情,用户验证就是其中一个很有意思的功能.具体用法: Header("WWW-Authenticate: Basic realm="USER LOGIN""); Header("HTTP/1.0 401 Unauthorized"); 在页首设计这两个Header函数,页面在载入前会出现一个登录框,要求输入用户名和密码.习惯了在页面登录的我们,是否觉得这样的登录很原始,又很新奇呢? 为了获取从这个对

Header函数和PHP_AUTH_USER做用户验证

php Header PHP_AUTH_USER PHP_AUTH_PW 用户验证 在php中,可以使用Header函数做一些有趣的事情,用户验证就是其中一个很有意思的功能.具体用法: Header("WWW-Authenticate: Basic realm="USER LOGIN""); Header("HTTP/1.0 401 Unauthorized"); 在页首设计这两个Header函数,页面在载入前会出现一个登录框,要求输入用户名和密

header()函数

header()前不能有任何代码,即使有,也得用一个函数或关键字,让它不执行,否则header()函数无法执行 这个函数说白了是个跳转函数 跳转到指定页面(站内的或指定网址) 例: header('Location:http://www.baidu.com/'); 有几个小问题 1.Location   第一个字母大写 2.网址前必须加"http://",后面必须加"/" 3.Location:http://www.baidu.com/  前后必须加单引号 4.最后