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
用PHP和ACCESS写聊天室(八)
Oct 09 PHP
php xml实例 留言本
Mar 20 PHP
php Notice: Undefined index 错误提示解决方法
Aug 29 PHP
探讨方法的重写(覆载)详解
Jun 08 PHP
php防止恶意刷新与刷票的方法
Nov 21 PHP
分享一段PHP制作的中文拼音首字母工具类
Dec 11 PHP
PHP调试函数和日志记录函数分享
Jan 31 PHP
Apache无法自动跳转却显示目录的解决方法
Nov 30 PHP
因str_replace导致的注入问题总结
Aug 08 PHP
Yii2框架中一些折磨人的坑
Dec 15 PHP
php7 新增功能实例总结
May 25 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下把数组保存为文件格式的实例应用
2010/02/08 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
2016/11/07 PHP
Laravel框架实现利用监听器进行sql语句记录功能
2018/06/06 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
2018/07/30 PHP
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
一个JavaScript递归实现反转数组字符串的实例
2014/10/14 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
基于javascript实现右下角浮动广告效果
2016/01/08 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
2016/05/05 Javascript
基于jQuery实现左侧菜单栏可折叠功能
2016/12/27 Javascript
bootstrap table实现单击单元格可编辑功能
2017/03/28 Javascript
详解nodejs express下使用redis管理session
2017/04/24 NodeJs
JS 设置Cookie 有效期 检测cookie
2017/06/15 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
浅谈Angular4中常用管道
2017/09/27 Javascript
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
使用python实现knn算法
2017/12/20 Python
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
python 日期排序的实例代码
2019/07/11 Python
python采集百度搜索结果带有特定URL的链接代码实例
2019/08/30 Python
django 实现celery动态设置周期任务执行时间
2019/11/19 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
简单几步用纯CSS3实现3D翻转效果
2019/01/17 HTML / CSS
医德医风学习心得体会
2016/01/25 职场文书
巾帼建功标兵先进事迹材料
2016/02/29 职场文书
Python OpenCV实现传统图片格式与base64转换
2021/06/13 Python
浅谈什么是SpringBoot异常处理自动配置的原理
2021/06/21 Java/Android
python库sklearn常用操作
2021/08/23 Python
nginx内存池源码解析
2021/11/20 Servers
python运算符之与用户交互
2022/04/13 Python