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 相关文章推荐
ftp类(example.php)
Oct 09 PHP
?算你??的 PHP 程式大小
Dec 06 PHP
开源SNS系统-ThinkSNS
May 18 PHP
浅谈PHP 闭包特性在实际应用中的问题
Oct 30 PHP
在PHP中养成7个面向对象的好习惯
Jul 17 PHP
献给php初学者(入门学习经验谈)
Oct 12 PHP
php设计模式 Template (模板模式)
Jun 26 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
Jun 20 PHP
php中读写文件与读写数据库的效率比较分享
Oct 19 PHP
采用memcache在web集群中实现session的同步会话
Jul 05 PHP
PHP的PDO常用类库实例分析
Apr 07 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
Oct 14 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中用文本文件做数据库的实现方法
2008/03/27 PHP
php中去除所有js,html,css代码
2010/10/12 PHP
一个基于PDO的数据库操作类
2011/03/24 PHP
PHP编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
php随机抽奖实例分析
2015/03/04 PHP
使用php转义输出HTML到JavaScript
2015/03/27 PHP
简单介绍win7下搭建apache+php+mysql开发环境
2015/08/06 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
2017/02/17 PHP
PHP重定向与伪静态区别
2017/02/19 PHP
Open and Print a Word Document
2007/06/15 Javascript
jquery的颜色选择插件实例代码
2008/10/02 Javascript
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
setInterval与clearInterval的使用示例代码
2014/01/28 Javascript
JS 打印功能代码可实现打印预览、打印设置等
2014/10/31 Javascript
JavaScript常用的弹出广告及背投广告实现方法
2015/02/06 Javascript
node.js从数据库获取数据
2016/05/08 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
2016/07/26 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
在Layui中实现开关按钮的效果实例
2019/09/29 Javascript
基于Vue sessionStorage实现保留搜索框搜索内容
2020/06/01 Javascript
初步解析Python中的yield函数的用法
2015/04/03 Python
Python中获取对象信息的方法
2015/04/27 Python
python实现监控某个服务 服务崩溃即发送邮件报告
2018/06/21 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
奇怪的鱼:Weird Fish
2018/03/18 全球购物
国贸专业的职业规划书
2014/03/15 职场文书
大学迎新晚会主持词
2014/03/24 职场文书
保护母亲河倡议书
2014/04/14 职场文书
工程负责人任命书
2014/06/06 职场文书
英语系本科生求职信
2014/07/15 职场文书
廉政承诺书2015
2015/04/28 职场文书
道歉信范文
2015/05/12 职场文书
Vue vee-validate插件的简单使用
2021/06/22 Vue.js