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 相关文章推荐
解决MySQL中文输出变成问号的问题
Jun 05 PHP
php下过滤html代码的函数 提高程序安全性
Mar 02 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
Oct 12 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
Jun 18 PHP
php自动识别文件编码并转换为UTF-8的方法
Jun 12 PHP
smarty半小时快速上手入门教程
Oct 27 PHP
PHP从FLV文件获取视频预览图的方法
Mar 12 PHP
PHP设计模式之装饰者模式代码实例
May 11 PHP
php实现面包屑导航例子分享
Dec 19 PHP
Linux系统中为php添加pcntl扩展
Aug 28 PHP
PHP中的函数声明与使用详解
May 27 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
Jun 24 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 excel类 phpExcel使用方法介绍
2010/08/21 PHP
php中使用Akismet防止垃圾评论的代码
2011/06/10 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
2013/06/19 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
2013/06/24 PHP
php获得url参数中具有&amp;的值的方法
2014/03/05 PHP
php检查页面是否被百度收录
2015/10/28 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
2020/01/23 PHP
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
JavaScript常用全局属性与方法记录积累
2013/07/03 Javascript
JavaScript中instanceof运算符的用法总结
2013/11/19 Javascript
22点关于jquery性能优化的建议
2014/05/28 Javascript
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
JS实现的另类手风琴效果网页内容切换代码
2015/09/08 Javascript
JS实现回到页面顶部动画效果的简单实例
2016/05/24 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
nodejs结合socket.io实现websocket通信功能的方法
2018/01/12 NodeJs
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
Python3中类、模块、错误与异常、文件的简易教程
2017/11/20 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
python互斥锁、加锁、同步机制、异步通信知识总结
2018/02/11 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
2018/04/18 Python
python Gunicorn服务器使用方法详解
2019/07/22 Python
详解PyTorch手写数字识别(MNIST数据集)
2019/08/16 Python
python爬虫 正则表达式解析
2019/09/28 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
企业行政文员岗位职责
2013/12/03 职场文书
《石榴》教学反思
2014/03/02 职场文书
外贸员简历中的自我评价
2014/03/04 职场文书
环保倡议书范文
2014/05/12 职场文书
交通事故和解协议书
2014/09/25 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书
质检员岗位职责
2015/02/03 职场文书
mysql sum(if())和count(if())的用法说明
2022/01/18 MySQL
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis