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 相关文章推荐
删除无限分类并同时删除它下面的所有子分类的方法
Aug 08 PHP
遭遇php的in_array低性能问题
Sep 17 PHP
PHP编程之设置apache虚拟目录
Jul 08 PHP
php文件包含目录配置open_basedir的使用与性能详解
Apr 03 PHP
php实现的redis缓存类定义与使用方法示例
Aug 09 PHP
PHP使用SMTP邮件服务器发送邮件示例
Aug 28 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
Oct 15 PHP
php命名空间设计思想、用法与缺点分析
Jul 17 PHP
Thinkphp自定义生成缩略图尺寸的方法
Aug 05 PHP
mac pecl 安装php7.1扩展教程
Oct 17 PHP
php 命名空间(namespace)原理与用法实例小结
Nov 13 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 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
全国FM电台频率大全 - 15 山东省
2020/03/11 无线电
php入门学习知识点三 PHP上传
2011/07/14 PHP
php+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
PHP+ajax实现二级联动菜单功能示例
2018/08/10 PHP
Laravel中错误与异常处理的用法示例
2018/09/16 PHP
用 javascript 实现的点击复制代码
2007/03/24 Javascript
淘宝搜索框效果实现分析
2011/03/05 Javascript
Nodejs实现批量下载妹纸图
2015/05/28 NodeJs
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
jQuery中Find选择器用法示例
2016/09/21 Javascript
js实现表单提交后不重新刷新当前页面
2016/11/30 Javascript
js实现带简单弹性运动的导航条
2017/02/22 Javascript
HTML5+jQuery实现搜索智能匹配功能
2017/03/24 jQuery
利用forever和pm2部署node.js项目过程
2017/05/10 Javascript
AngularJS 验证码60秒倒计时功能的实现
2017/06/05 Javascript
JS实现头条新闻的经典轮播图效果示例
2019/01/30 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
2019/11/07 Javascript
Vue中使用JsonView来展示Json树的实例代码
2020/11/16 Javascript
Python实现的括号匹配判断功能示例
2018/08/25 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
2018/12/10 Python
python 修改本地网络配置的方法
2019/08/14 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
Python 切分数组实例解析
2019/11/07 Python
Pytorch之parameters的使用
2019/12/31 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
2020/06/08 Python
HTML如何让IMG自动适应DIV容器大小的实现方法
2020/02/25 HTML / CSS
单位实习证明怎么写
2014/01/17 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
单位考核聘任报告
2015/03/02 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
一文读懂navicat for mysql基础知识
2021/05/31 MySQL
小程序与后端Java接口交互实现HelloWorld入门
2021/07/09 Java/Android
Java由浅入深通关抽象类与接口(下篇)
2022/04/26 Java/Android