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 相关文章推荐
用Zend Encode编写开发PHP程序
Oct 09 PHP
php模板之Phpbean的目录结构
Jan 10 PHP
PHP中几个常用的魔术常量
Feb 23 PHP
解析PHP实现下载文件的两种方法
Jul 05 PHP
php弹出对话框实现重定向代码
Jan 23 PHP
ThinkPHP查询中的魔术方法简述
Jun 25 PHP
php中用memcached实现页面防刷新功能
Aug 19 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
Jul 01 PHP
php抛出异常与捕捉特定类型的异常详解
Oct 26 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
Feb 28 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
Apr 20 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 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 缓冲的免费实现方法
2006/10/09 PHP
PHP网站开发中常用的8个小技巧
2015/02/13 PHP
PHP递归调用数组值并用其执行指定函数的方法
2015/04/01 PHP
PHP闭包函数详解
2016/02/13 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
2020/05/02 PHP
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
学习JS面向对象成果 借国庆发布个最新作品与大家交流
2009/10/03 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
javaScript 删除字符串空格多种方法小结
2012/10/24 Javascript
利用js读取动态网站从服务器端返回的数据
2014/02/10 Javascript
JsRender for object语法简介
2014/10/31 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
2015/03/24 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
2016/01/12 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
2016/12/14 Javascript
纯JS实现图片验证码功能并兼容IE6-8(推荐)
2017/04/19 Javascript
jQuery实现简单的回到顶部totop功能示例
2017/10/16 jQuery
vue2.0+ 从插件开发到npm发布的示例代码
2018/04/28 Javascript
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
Python中的闭包总结
2014/09/18 Python
使用wxPython获取系统剪贴板中的数据的教程
2015/05/06 Python
Python之用户输入的实例
2018/06/22 Python
详解python单元测试框架unittest
2018/07/02 Python
Html5 webview元素定位工具的实现
2020/08/07 HTML / CSS
数控加工专业毕业生自荐信
2013/09/27 职场文书
法律系毕业生自荐信范文
2014/03/27 职场文书
五水共治捐款倡议书
2014/05/14 职场文书
中文专业自荐书
2014/06/29 职场文书
经济贸易系求职信
2014/08/04 职场文书
初中国旗下的演讲稿
2014/08/28 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
《风娃娃》教学反思
2016/02/18 职场文书
2019年警察入党转正申请书最新范文
2019/09/03 职场文书
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
python 多态 协议 鸭子类型详解
2021/11/27 Python