header与缓冲区之间的深层次分析


Posted in PHP onJuly 30, 2016

测试header之前有输出

<?php
echo 'hello world!';
header('content-type: text/html;charset=utf-8;');

我经过测试时可以成功的,不会出现任何错误和警告。不知道你们是怎么样的?可是我想大多说都是没有问题,如果出现了Cannot modify header information - headers already sent这样的警告,这是是说不能修改头部信息,头部信息已经发送。下来就了解一下为什么会出现两种不同结果?

缓冲区

做个比喻,就好比我们看电影时的缓存一样。它不会之间立即给我们播放出来,而是先将一部分下载好的电影放到缓存里面,再有缓存播放出来。我们编写php代码也是这个道理

php的缓存机制-output_buffering

php中的常用ob函数

ob_start: 打开输出缓冲区
ob_clean: 清空缓冲区
ob_get_contents: 返回缓冲区内容
ob_get_clean: 返回缓冲区内容,并清空

<?php
ob_start();
echo 'hello world!';
echo ob_get_contents();//输出hello world!hello world!

php.ini配置文件中,修改缓冲区大小

一般在233行左右,默认是4096表示4096字节也就是4kB

下来将4096修改为5,重新运行这段代码

<?php
echo 'hello world!';
header('content-type: text/html;charset=utf-8;');

对于刚才测试不会出现警告或错误的现在却出现了,错误就是:Cannot modify header information - headers already sent

header与缓冲区之间的分析

为什么我们之前说header之前不能有输出

对于header函数,它是像客户端发送原始的http报头,是声明我们所写网页到底是什么内容,所以一但这个声明之前有内容就是错误的,是不符合http规则的

下来说说php中的header

在php中header是不经过缓冲区的,它会经过服务器直接输出到客户端

解释之前的警告Cannot modify header information

当我们在header之前写了一些输出的话,它会先经过缓冲区。因此即便你写的了前面,最终的输出顺序还是先header在echo

可是一但我们输出的内容缓存区放不下,即之前的输出'hello world!' > 5个字节。就会直接输出出来,也就是这样先输出'hello world'header(...),这样就违背了真实的header之前不能有输出

总结

在实际当中,我们最好还是把header写在页面最前面。因为我们就不确定我们header之前的输出内容是否缓冲区能放下。希望本文对大家学习php有所帮助。

PHP 相关文章推荐
Php Cookie的一个使用注意点
Nov 08 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
Dec 29 PHP
simplehtmldom Doc api帮助文档
Mar 26 PHP
PHP编码转换函数 自动转换字符集支持数组转换
Dec 16 PHP
sql注入与转义的php函数代码
Jun 17 PHP
PHP CURL获取cookies模拟登录的方法
Nov 04 PHP
使用php显示搜索引擎来的关键词
Feb 13 PHP
PHP实现货币换算的方法
Nov 29 PHP
WordPress开发中短代码的实现及相关函数使用技巧
Jan 05 PHP
简单实现PHP留言板功能
Dec 21 PHP
基于swoole实现多人聊天室
Jun 14 PHP
PHP设计模式之命令模式示例详解
Dec 20 PHP
laravel学习教程之关联模型
Jul 30 #PHP
laravel学习教程之存取器
Jul 30 #PHP
thinkphp表单上传文件并将文件路径保存到数据库中
Jul 28 #PHP
thinkphp验证码的实现(form、ajax实现验证)
Jul 28 #PHP
Thinkphp3.2.3分页使用实例解析
Jul 28 #PHP
thinkphp3.2.3 分页代码分享
Jul 28 #PHP
php实现带读写分离功能的MySQL类完整实例
Jul 28 #PHP
You might like
PHP函数shuffle()取数组若干个随机元素的方法分析
2016/04/02 PHP
thinkPHP5 ACL用户权限模块用法详解
2017/05/10 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
php实现的AES加密类定义与用法示例
2018/01/29 PHP
用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
2010/06/19 Javascript
jQuery Ajax使用 全解析
2010/12/15 Javascript
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
Js 去掉字符串中的空格(实现代码)
2013/11/19 Javascript
解析页面加载与js函数的执行 onload or ready
2013/12/12 Javascript
jQuery实现表格行上移下移和置顶的方法
2015/05/22 Javascript
javascript中$(function() {});写与不写有哪些区别
2015/08/10 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
2017/02/21 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
2017/02/28 Javascript
JS判断非空至少输入两个字符的简单实现方法
2017/06/23 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
[04:17]DOTA2完美盛典,rOtk、BurNIng携手巴图演唱《倔强》
2017/11/28 DOTA
python动态加载变量示例分享
2014/02/17 Python
Python深度优先算法生成迷宫
2018/01/22 Python
python 中字典嵌套列表的方法
2018/07/03 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
十分钟搞定pandas(入门教程)
2019/06/21 Python
python3常用的数据清洗方法(小结)
2019/10/31 Python
python3-flask-3将信息写入日志的实操方法
2019/11/12 Python
Python configparser模块封装及构造配置文件
2020/08/07 Python
CSS3伪类选择器:nth-child()
2009/04/02 HTML / CSS
用HTML5实现手机摇一摇的功能的教程
2012/10/30 HTML / CSS
Europcar英国:英国汽车和货车租赁
2017/01/21 全球购物
学生喝酒检讨书
2014/02/06 职场文书
詹天佑教学反思
2014/04/30 职场文书
工商局个人工作总结
2015/03/03 职场文书
学校禁毒宣传活动总结
2015/05/08 职场文书
劳动仲裁调解书
2015/05/20 职场文书