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学习之正则表达式
Apr 17 PHP
php高级编程-函数-郑阿奇
Jul 04 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
Jul 05 PHP
浅析PHP微信支付通知的处理方式
May 25 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
Jul 29 PHP
php实现Mongodb自定义方式生成自增ID的方法
Mar 23 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
May 22 PHP
深入理解PHP中的empty和isset函数
May 26 PHP
Yii模型操作之criteria查找数据库的方法
Jul 15 PHP
php 实现301重定向跳转实例代码
Jul 18 PHP
php_pdo 预处理语句详解
Nov 21 PHP
php修改数组键名的方法示例
Apr 15 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输出XML到页面的3种方法详解
2013/06/06 PHP
php实现memcache缓存示例讲解
2013/12/04 PHP
PHP加密解密类实例分析
2015/04/20 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
用表格输出1-1000之间的数字实现代码(附特效)
2013/04/21 Javascript
js中window.open()的所有参数详细解析
2014/01/09 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
JavaScript通过setTimeout实时显示当前时间的方法
2015/04/16 Javascript
兼容各大浏览器的JavaScript阻止事件冒泡代码
2015/07/09 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
很不错的两款Bootstrap Icon图标选择组件
2016/01/28 Javascript
javascript获取网页各种高宽及位置的方法总结
2016/07/27 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
微信通过页面(H5)直接打开本地app的解决方法
2017/09/09 Javascript
Javascript类型判断相关例题及解析
2020/08/26 Javascript
[01:58]2018DOTA2亚洲邀请赛趣味视频——交流
2018/04/03 DOTA
新手该如何学python怎么学好python?
2008/10/07 Python
django多文件上传,form提交,多对多外键保存的实例
2019/08/06 Python
python中with用法讲解
2020/02/07 Python
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
瑞典快乐袜子:Happy Socks
2018/02/16 全球购物
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
草船借箭教学反思
2014/02/03 职场文书
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
自愿解除劳动合同协议书
2014/09/11 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
2014年财务个人工作总结
2014/12/08 职场文书
村干部任职承诺书
2015/01/21 职场文书
内勤岗位职责
2015/02/10 职场文书
2015年共青团工作总结
2015/05/15 职场文书
Docker下安装Oracle19c
2022/04/13 Servers