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 编程安全性小结
Jan 08 PHP
php下封装较好的数字分页方法
Nov 23 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
Aug 06 PHP
PHP上传文件时文件过大$_FILES为空的解决方法
Nov 26 PHP
对PHP语言认识上需要避免的10大误区
Jun 12 PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 PHP
php使用ereg验证文件上传的方法
Dec 16 PHP
10个超级有用值得收藏的PHP代码片段
Jan 22 PHP
Symfony2实现在doctrine中内置数据的方法
Feb 05 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
Aug 11 PHP
PHP文件上传小程序 适合初学者学习!
May 23 PHP
php+mysql实现的无限分类方法类定义与使用示例
May 27 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(4) php 函数 补充2
2010/02/15 PHP
php垃圾代码优化操作代码
2010/08/05 PHP
php中将一个对象保存到Session中的方法
2015/03/13 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
PHP树形结构tree类用法示例
2019/02/01 PHP
js 颜色选择器(兼容firefox)
2009/03/05 Javascript
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
2012/02/03 Javascript
如何改进javascript代码的性能
2015/04/02 Javascript
WebApi+Bootstrap+KnockoutJs打造单页面程序
2016/05/16 Javascript
微信小程序 扎金花简单实例
2017/02/21 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
详解10分钟学会vue滚动行为
2017/09/21 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
vuex入门最详细整理
2020/03/04 Javascript
javascript实现评分功能
2020/06/24 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
全网小程序接口请求封装实例代码
2020/11/06 Javascript
如何在现代JavaScript中编写异步任务
2021/01/31 Javascript
Python中文字符串截取问题
2015/06/15 Python
python判断列表的连续数字范围并分块的方法
2018/11/16 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
Django中间件基础用法详解
2019/07/18 Python
在django view中给form传入参数的例子
2019/07/19 Python
tensorflow2.0保存和恢复模型3种方法
2020/02/03 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
ProBikeKit美国官网:自行车套件,跑步和铁人三项套件
2016/10/13 全球购物
渗透攻击的测试步骤
2014/06/07 面试题
护理毕业生自荐信范文
2013/12/22 职场文书
中华美德颂演讲稿
2014/05/20 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
使用Springboot实现健身房管理系统
2021/07/01 Java/Android
7个关于Python的经典基础案例
2021/11/07 Python
Mybatis 一级缓存和二级缓存原理区别
2022/09/23 Java/Android