PHP中对缓冲区的控制实现代码


Posted in PHP onSeptember 29, 2013

大家在使用PHP的过程中不免要使用到header和setcookie两个函数,这两个函数会发送一段文件头信息给浏览器,但是如果在使用这两个函数之前已经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错,提示信息如下:“Header had all ready send by”!那有什么方法可以在有了输出的情况下面在发送文件头信息呢?在PHP 4.0里面加入了缓冲区控制的几个函数,使用这些函数可以帮我们解决很多问题。

一、 相关函数简介:

1、Flush:输出缓冲区内的内容并且删除缓冲区。

函数格式:flush()

说明:这个函数经常使用,效率很高。

2、ob_start :打开输出缓冲区

函数格式:void ob_start(void)

说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或者使用ob_end_clean()来输出缓冲区的内容。

3 、ob_get_contents :返回内部缓冲区的内容。

使用方法:string ob_get_contents(void)

说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE 。

4、ob_get_length:返回内部缓冲区的长度。

使用方法:int ob_get_length(void)

说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活。则返回 FALSE。

5、ob_end_flush :发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区。

使用方法:void ob_end_flush(void)

说明:这个函数发送输出缓冲区的内容(如果有的话)。

6、ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区

使用方法:void ob_end_clean(void)

说明:这个函数不会输出内部缓冲区的内容!

7、ob_implicit_flush:打开或关闭绝对刷新

使用方法:void ob_implicit_flush ([int flag])

说明:使用过Perl的人都知道?$|=x的意义,这个字符串可以打开/关闭缓冲区,而ob_implicit_flush函数也和那个一样,默认为关闭缓冲区,打开绝对输出。

二、使用例子:

在一开始,笔者说了用缓冲区控制的函数可以防止文件头发送信息出错,下面就是一个例子:

<? //PHP提示符
ob_start(); //打开缓冲区
echo "Hello/n"; //输出
header('location:gotourl.php'); //把浏览器重定向到gotourl.php
?>

如果去掉ob_start,PHP就会提示在文件的第4行出错(出错信息如前面所示),但是加上ob_start,就不会提示出错,原因是当打开了缓冲区,echo后面的字符不会输出到浏览器,而是保留在服务器,直到你使用flush或者ob_end_flush才会输出,所以并不会有任何文件头输出的错误!

下面再给出一个很经典的用途:

比如你用<?phpinfo();?>得到服务器和客户端的设置信息,但是这个信息会因为客户端的不同而不同,如果想要保存phpinfo()函数的输出怎么办呢?在没有缓冲区控制之前,可以说一点办法也没有,但是有了缓冲区的控制,我们可以轻松的解决:

<?
ob_start(); //打开缓冲区
phpinfo(); //使用phpinfo函数
?$info=ob_get_contents(); //得到缓冲区的内容并且赋值给?$info
?$file=fopen('info.txt','w'); //打开文件info.txt
fwrite(?$file,?$info); //写入信息到info.txt
fclose(?$file); //关闭文件info.txt
?>

用以上的方法,就可以把不同用户的phpinfo信息保存下来,这在以前恐怕没有办法办到!其实上面就是将一些“过程”转化为“函数”的方法!

PHP 相关文章推荐
php部分常见问题总结
Mar 27 PHP
php数组函数序列之array_values() 获取数组元素值的函数与方法
Oct 30 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
Dec 18 PHP
php生成唯一数字id的方法汇总
Nov 18 PHP
PHP中Restful api 错误提示返回值实现思路
Apr 12 PHP
PHP7标量类型declare用法实例分析
Sep 26 PHP
PHP图像识别技术原理与实现
Oct 27 PHP
详解PHP文件的自动加载(autoloading)
Feb 04 PHP
thinkPHP3.2.2框架行为扩展及demo示例
Jun 19 PHP
一次因composer错误使用引发的问题与解决
Mar 06 PHP
如何在PHP中使用AES加密算法加密数据
Jun 24 PHP
PHP延迟静态绑定使用方法实例解析
Sep 05 PHP
PHP验证码函数代码(简单实用)
Sep 29 #PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
Sep 28 #PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
Sep 28 #PHP
PHP无限分类(树形类)
Sep 28 #PHP
PHP的PSR规范中文版
Sep 28 #PHP
PHP中time(),date(),mktime()区别介绍
Sep 28 #PHP
php中time()和mktime()方法的区别
Sep 28 #PHP
You might like
PHP 数组入门教程小结
2009/05/20 PHP
PHP输出两个数字中间有多少个回文数的方法
2015/03/23 PHP
PHP查看SSL证书信息的方法
2016/09/22 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
PHP连续签到功能实现方法详解
2019/12/04 PHP
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
JavaScript动态调整TextArea高度的代码
2010/12/28 Javascript
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
D3.js实现柱状图的方法详解
2016/09/21 Javascript
etmvc+jQuery EasyUI+combobox多值操作实现角色授权实例
2016/11/09 Javascript
Bootstrap的class样式小结
2016/12/01 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
2017/02/11 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
简单理解Vue中的nextTick方法
2018/01/30 Javascript
解决vuecli3中img src 的引入问题
2020/08/04 Javascript
vue-cli3项目配置eslint代码规范的完整步骤
2020/09/10 Javascript
[01:15:00]LGD vs Mineski Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
python基于multiprocessing的多进程创建方法
2015/06/04 Python
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
flask中的wtforms使用方法
2018/07/21 Python
python应用文件读取与登录注册功能
2019/09/23 Python
Pytorch高阶OP操作where,gather原理
2020/04/30 Python
python 最简单的实现适配器设计模式的示例
2020/06/30 Python
英国著名书店:Foyles
2018/12/01 全球购物
静态变量和实例变量的区别
2015/07/07 面试题
应届毕业生就业自荐信
2013/10/26 职场文书
护理专业大学生自我推荐信
2014/01/25 职场文书
高中军训感想800字
2014/02/23 职场文书
优秀班主任申报材料
2014/12/16 职场文书
详解python的内存分配机制
2021/05/10 Python
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技