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制作的意见反馈表源码
Mar 11 PHP
PHP+ajax 无刷新删除数据
Feb 20 PHP
Linux下CoreSeek及PHP扩展模块的安装
Sep 23 PHP
Laravel 4 初级教程之视图、命名空间、路由
Oct 30 PHP
php计算函数执行时间的方法
Mar 20 PHP
PHP远程调试之XDEBUG
Dec 29 PHP
一个简单安全的PHP验证码类 附调用方法
Jun 24 PHP
php 解决substr()截取中文字符乱码问题
Jul 18 PHP
php实现登录tplink WR882N获取IP和重启的方法
Jul 20 PHP
PHP使用两个栈实现队列功能的方法
Jan 15 PHP
PHP正则判断一个变量是否为正整数的方法
Feb 27 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
May 08 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反弹shell实现代码
2009/04/22 PHP
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
PHP实现GIF图片验证码
2015/11/04 PHP
PHP实现QQ空间自动回复说说的方法
2015/12/02 PHP
php面向对象值单例模式
2016/05/03 PHP
php实现用户登陆简单实例
2017/04/04 PHP
基于php流程控制语句和循环控制语句(讲解)
2017/10/23 PHP
Array.prototype.slice.apply的使用方法
2010/03/17 Javascript
Js中获取frames中的元素示例代码
2013/07/30 Javascript
常用的几段javascript代码分享
2014/03/25 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
2016/08/10 Javascript
利用Node.js制作爬取大众点评的爬虫
2016/09/22 Javascript
jQuery事件blur()方法的使用实例讲解
2019/03/30 jQuery
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
H5实现手机拍照和选择上传功能
2019/12/18 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
[01:14:30]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第二场 8.20.mp4
2019/08/22 DOTA
python web框架学习笔记
2016/05/03 Python
pandas数据预处理之dataframe的groupby操作方法
2018/04/13 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
html5弹跳球示例代码
2013/07/23 HTML / CSS
用HTML5的canvas实现一个炫酷时钟效果
2016/05/20 HTML / CSS
在C#中如何实现多态
2014/07/02 面试题
党员的自我评价范文
2014/01/02 职场文书
考试不及格的检讨书
2014/01/22 职场文书
元旦晚会策划方案
2014/02/18 职场文书
小学生竞选班干部演讲稿
2014/04/24 职场文书
2014教师年度工作总结
2014/11/10 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
2014年图书室工作总结
2014/12/09 职场文书
三好学生个人总结
2015/02/15 职场文书
我们认为中短波广播场强仪的最佳组合
2022/04/05 无线电
台积电称即便经济低迷也没有降价的计划
2022/04/21 数码科技
python数据分析之单因素分析线性拟合及地理编码
2022/06/25 Python