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数据库操作面向对象的优点
Oct 09 PHP
56.com视频采集接口程序(PHP)
Sep 22 PHP
PHPMailer邮件类利用smtp.163.com发送邮件方法
Sep 11 PHP
PHP分页显示制作详细讲解
Nov 19 PHP
PHP 彩色文字实现代码
Jun 29 PHP
PHP 第二节 数据类型之数组
Apr 28 PHP
PHP SPL使用方法和他的威力
Nov 12 PHP
ThinkPHP3.1基础知识快速入门
Jun 19 PHP
PHP实现生成唯一会员卡号
Aug 24 PHP
Apache无法自动跳转却显示目录的解决方法
Nov 30 PHP
PHP使用文件锁解决高并发问题示例
Mar 29 PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 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四舍五入、取整、round函数使用示例
2015/02/06 PHP
PHP访问数据库集群的方法小结
2016/03/14 PHP
php实现跨域提交form表单的方法【2种方法】
2016/10/17 PHP
js身份证验证超强脚本
2008/10/26 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
2013/12/31 Javascript
按钮接受回车事件的三种实现方法
2014/06/06 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
Bootstrap表格制作代码
2017/03/17 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
jQuery实现列表的增加和删除功能
2018/06/14 jQuery
JS实现单张或多张图片持续无缝滚动的示例代码
2020/05/10 Javascript
在vue中使用vant TreeSelect分类选择组件操作
2020/11/02 Javascript
[01:45]典藏宝瓶2+祈求者身心——这就是DOTA2TI9总奖金突破3000万美元的秘密
2019/07/21 DOTA
python使用win32com在百度空间插入html元素示例
2014/02/20 Python
学习python 之编写简单乘法运算题
2016/02/27 Python
Python解惑之整数比较详解
2017/04/24 Python
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
对Python中9种生成新对象的方法总结
2018/05/23 Python
Python通过for循环理解迭代器和生成器实例详解
2019/02/16 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
python basemap 画出经纬度并标定的实例
2019/07/09 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
Python基于gevent实现文件字符串查找器
2020/08/11 Python
python中pickle模块浅析
2020/12/29 Python
css3动画效果小结(推荐)
2016/07/25 HTML / CSS
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
小学教师听课制度
2014/02/01 职场文书
万年牢教学反思
2014/02/15 职场文书
计算机软件专业求职信
2014/06/10 职场文书
团员个人年度总结
2015/02/26 职场文书
2015年仓库管理员工作总结
2015/04/21 职场文书
话题作文之诚信
2019/11/28 职场文书
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python