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 相关文章推荐
JAVA/JSP学习系列之二
Oct 09 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
Jul 22 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
Jun 09 PHP
利用curl抓取远程页面内容的示例代码
Jul 23 PHP
解析php中如何调用用户自定义函数
Aug 06 PHP
php截取中文字符串函数实例
Feb 23 PHP
php不使用copy()函数复制文件的方法
Mar 13 PHP
编写PHP脚本来实现WordPress中评论分页的功能
Dec 10 PHP
PHP Oauth授权和本地加密实现方法
Aug 12 PHP
php 删除指定文件夹的实例讲解
Jul 25 PHP
php模式设计之观察者模式应用实例分析
Sep 25 PHP
php把文件设置为插件的技巧方法
Feb 03 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检测mysql表是否存在的方法小结
2017/07/20 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
关于 byval 与 byref 的区别分析总结
2007/10/08 Javascript
js控制框架刷新
2008/08/01 Javascript
js 金额文本框实现代码
2012/02/14 Javascript
使用console进行性能测试
2015/04/27 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
基于jQuery1.9版本如何判断浏览器版本类型
2016/01/12 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
jQuery.ajax 跨域请求webapi设置headers的解决方案
2016/08/08 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
2018/08/20 Javascript
js实现json数组分组合并操作示例
2019/02/12 Javascript
浅谈Vuex注入Vue生命周期的过程
2019/05/20 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
python3简单实现微信爬虫
2015/04/09 Python
python实现SMTP邮件发送功能
2020/06/16 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
flask-socketio实现WebSocket的方法
2018/07/31 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
2019/08/23 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
pycharm部署、配置anaconda环境的教程
2020/03/24 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
会计实习生自我鉴定
2013/12/12 职场文书
户外婚礼策划方案
2014/02/08 职场文书
主持词开场白
2014/03/17 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
《西门豹》教学反思
2016/02/23 职场文书
详解JavaScript的计时器和按钮效果设置
2022/02/18 Javascript
世界十大评分最高的动漫,CLANNAD上榜,第八赚足人们眼泪
2022/03/18 日漫
python基础之//、/与%的区别详解
2022/06/10 Python