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函数将失效。

转载于:https://www.cnblogs.com/yimuren/p/4195737.html

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

  1. PHP中header和session_start前不能有输出的原因

    在http传输文本中,规定必须 header和content顺序必须是:header在前content在后,并且header的格式必须满足"keyword: value\n"这种格 ...

  2. PHP中Header函数和PHP_AUTH_USER做用户验证

    php Header PHP_AUTH_USER PHP_AUTH_PW 用户验证 在php中,可以使用Header函数做一些有趣的事情,用户验证就是其中一个很有意思的功能.具体用法: Header( ...

  3. header函数解析

    一.header函数 按照官方文档的说法,header函数用来输出http头部信息,你可以有下面的这些用法: 1.使用header函数进行跳转页面: header('Location:'.$url); ...

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

    在php中,可以使用Header函数做一些有趣的事情,用户验证就是其中一个很有意思的功能.具体用法: Header("WWW-Authenticate: Basic realm=" ...

  5. PHP中header函数的用法及其注意重点是什么呢

    1.使用header函数进行跳转页面: header('Location:'.$url); 其中$url就是将要跳转的url了. 这种用法的注意事项有以下几点: •Location和":&q ...

  6. php header函数的详解,php header函数的详解_PHP教程

    header函数在php中是发前一些头部信息的,如果我们可以直接使用它来做301跳转等,下面我来总结关于header函数用法与一些常用见问题解决方法. 发送一个原始 HTTP 标头[Http Head ...

  7. PHP:header()函数

    1. header() 函数向客户端发送原始的 HTTP 报头. 认识到一点很重要,即必须在任何实际的输出被发送之前调用 header() 函数(在 PHP 4 以及更高的版本中,您可以使用输出缓存来 ...

  8. php输出英文时间日期格式,PHP使用函数gmstrftime、gmdate输出英文时间日期的安全方法(RFC 1123格式)...

    PHP使用函数gmstrftime.gmdate输出英文时间日期的安全方法(RFC 1123格式) 分类:PHP_Python| 发布:佚名| 查看: | 发表时间:2014/8/6 最近项目中要为一 ...

  9. Linux之shell编程篇-----Shell 函数和Shell 输入/输出重定向

    ​ 最近发现了一个挺厉害的人工智能学习网站,内容通俗易懂,风趣幽默,感兴趣的可以点击此链接进行查看:床长人工智能教程 废话不多说,请看正文! ​ Shell 函数 1. 自定义函数 linux she ...

最新文章

  1. 一年只有0.001「薇」!杜克大学陈怡然教授自嘲「科学家不如带货」
  2. 9 HTML5之表单
  3. 统计插件_CG Teamwork统计提交量插件制作思路
  4. MC34063组成DC-DC电路
  5. .NET MYSQL数据库操作基类( C#源码)
  6. linux修改py内容,python中修改文件行内容
  7. Excel如何删除表格中的空白列
  8. JTAG IEEE 1194.1笔记
  9. 2021年广东省安全员A证第三批(主要负责人)考试内容及广东省安全员A证第三批(主要负责人)免费试题
  10. 应对微软黑屏的解决办法
  11. python连接数据库mysql失败_python连接mysql失败怎么解决
  12. 失眠的岁月,我们都交了哪些科技智商税?
  13. 豪江智能更新招股书:2021年净利润、毛利率双降,表现不及同行
  14. Latex矩阵和表达式组的绘制
  15. Zigzag 压缩小整数
  16. nginx代理的域名对应的ip更换后还解析到之前的ip
  17. EOS基础全家桶(四)启动节点
  18. vscode运行Live Server报错:Windows找不到文件‘chrome‘,请确定文件名是否正确后,再试一次。
  19. moviepy音视频剪辑:使用fl_time进行诸如快播、慢播、倒序播放等时间特效处理的原理和可能遇到的坑
  20. CentOS 服务器 git clone下载加速(下载过慢或超时)

热门文章

  1. 长文详解基于并行计算的条件随机场CRF
  2. 梯度下降法快速教程 | 第一章:Python简易实现以及对学习率的探讨
  3. 深度学习(三十六)异构计算CUDA学习笔记(1)
  4. 机器学习(十五)隐马尔科夫模型-未完待续
  5. vue中如何调取api_vue-router在history模式下如何调用api?
  6. 用字典存储学生成绩查询_中考用分数评价学生音体美成绩未尝不是好事
  7. Java Object 类 深入分析
  8. 网络抓包工具wireshark 安装教程
  9. VMware vSphere、 ESXi、Vcenter、vSphere Client关系
  10. 渗透测试入门7之权限维持