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 和 MySQL 开发的 8 个技巧
Oct 09 PHP
php Hex RGB颜色值互换的使用
May 10 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
Jun 24 PHP
php读取目录所有文件信息dir示例
Mar 18 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
Feb 02 PHP
php使用strip_tags()去除html标签仍有空白的解决方法
Jul 28 PHP
PHP实现上传图片到 zimg 服务器
Oct 19 PHP
ThinkPHP实现生成和校验验证码功能
Apr 28 PHP
PHP中Notice错误常见解决方法
Apr 28 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
Jan 27 PHP
PHP实现的敏感词过滤方法示例
Mar 06 PHP
yii框架结合charjs实现统计30天数据的方法
Apr 04 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
一个用于MySQL的PHP XML类
2006/10/09 PHP
比较全面的PHP数组的使用方法小结
2010/09/23 PHP
php实现无限级分类实现代码(递归方法)
2011/01/01 PHP
php数组函数序列之array_keys() - 获取数组键名
2011/10/30 PHP
ThinkPHP连接Oracle数据库
2016/04/22 PHP
php登录超时检测功能实例详解
2017/03/21 PHP
放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解
2013/04/20 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
jQuery中:not选择器用法实例
2014/12/30 Javascript
详解JavaScript中getFullYear()方法的使用
2015/06/10 Javascript
JavaScript实现动态添加,删除行的方法实例详解
2015/07/02 Javascript
JavaScript编写连连看小游戏
2015/07/07 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
javascript代码优化的8点总结
2018/01/29 Javascript
模块化react-router配置方法详解
2019/06/03 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
2020/07/01 Javascript
[02:42]决战东方!DOTA2亚洲邀请赛重启荣耀之争
2017/03/17 DOTA
[45:15]Optic vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
Python找出微信上删除你好友的人脚本写法
2018/11/01 Python
使用Python获取网段IP个数以及地址清单的方法
2018/11/01 Python
解决pip install psycopg2出错问题
2020/07/09 Python
Sisley法国希思黎美国官方网站:享誉全球的奢华植物美容品牌
2020/06/27 全球购物
自主招生自荐信格式
2013/12/03 职场文书
2014年圣诞节寄语
2014/12/08 职场文书
初中作文评语
2014/12/25 职场文书
公司放假通知怎么写
2015/04/15 职场文书
灵魂歌王观后感
2015/06/17 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
【TED出品】天梯非主流开心游1700 划水骑士
2022/03/31 魔兽争霸