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 fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
May 24 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
Jun 18 PHP
CodeIgniter模板引擎使用实例
Jul 15 PHP
PHP函数实现分页含文本分页和数字分页
Oct 23 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
Jan 07 PHP
SSO单点登录的PHP实现方法(Laravel框架)
Mar 23 PHP
Smarty模板变量调节器用法分析
May 23 PHP
php微信公众平台开发(三)订阅事件处理
Dec 06 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
Feb 28 PHP
PHP7多线程搭建教程
Apr 21 PHP
PHP对象的浅复制与深复制的实例详解
Oct 26 PHP
PHP反射实际应用示例
Apr 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 HTML代码串 截取实现代码
2009/06/29 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
yii使用activeFileField控件实现上传文件与图片的方法
2015/12/28 PHP
PHP用户验证和标签推荐的简单使用
2016/10/31 PHP
windows系统下简单nodejs安装及环境配置
2013/01/08 NodeJs
jQuery遍历Form示例代码
2013/09/03 Javascript
JS实现可点击展开与关闭的左侧广告代码
2015/09/02 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
10道典型的JavaScript面试题
2017/03/22 Javascript
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决
2019/12/22 Javascript
extjs图表绘制之条形图实现方法分析
2020/03/06 Javascript
python基础教程之元组操作使用详解
2014/03/25 Python
django批量导入xml数据
2016/10/16 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
python requests爬取高德地图数据的实例
2018/11/10 Python
Python操作redis实例小结【String、Hash、List、Set等】
2019/05/16 Python
linux环境下Django的安装配置详解
2019/07/22 Python
python用类实现文章敏感词的过滤方法示例
2019/10/27 Python
Python3实现英文字母转换哥特式字体实例代码
2020/09/01 Python
Pycharm安装python库的方法
2020/11/24 Python
1688平价精选商城:阿里集团旗下,工厂出厂价格直销
2017/04/24 全球购物
意大利拉斐尔时尚购物网:Raffaello Network(支持中文)
2018/11/09 全球购物
Jar包的作用是什么
2014/03/30 面试题
Why we need EJB
2016/10/20 面试题
普通党员自我剖析材料
2014/10/07 职场文书
小学教师先进事迹材料
2014/12/15 职场文书
三下乡个人总结
2015/03/04 职场文书
2015年小学语文工作总结
2015/05/25 职场文书
SQLServer之常用函数总结详解
2021/08/30 SQL Server