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翻页类
Jun 01 PHP
php 静态变量的初始化
Nov 15 PHP
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
Nov 02 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
Jan 19 PHP
php查看请求头信息获取远程图片大小的方法分享
Dec 25 PHP
php调用mysql存储过程实例分析
Dec 29 PHP
Laravel实现用户注册和登录
Jan 23 PHP
PHP进程同步代码实例
Feb 12 PHP
php随机抽奖实例分析
Mar 04 PHP
joomla数据库操作示例代码
Jan 06 PHP
浅谈PHP链表数据结构(单链表)
Jun 08 PHP
laravel使用数据库测试注意事项
Apr 10 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
一个简单的自动发送邮件系统(一)
2006/10/09 PHP
php smarty模版引擎中的缓存应用
2009/12/11 PHP
PHP 数组和字符串互相转换实现方法
2013/03/26 PHP
php使用curl获取https请求的方法
2015/02/11 PHP
PHP常用的三种设计模式
2017/02/17 PHP
xmlHTTP实例
2006/10/24 Javascript
浅析XMLHttpRequest的缓存问题
2013/12/13 Javascript
jquery单行文字向上滚动效果的实现代码
2014/09/05 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
原生js仿浏览器滚动条效果
2017/03/02 Javascript
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
AngularJS实现的select二级联动下拉菜单功能示例
2017/10/25 Javascript
mpvue构建小程序的方法(步骤+地址)
2018/05/22 Javascript
浅谈关于iview表单验证的问题
2018/09/29 Javascript
Vue 动态组件components和v-once指令的实现
2019/08/30 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
2019/09/11 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
2020/03/10 Javascript
Python Socket编程详细介绍
2017/03/23 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
django 删除数据库表后重新同步的方法
2018/05/27 Python
从django的中间件直接返回请求的方法
2018/05/30 Python
Linux系统(CentOS)下python2.7.10安装
2018/09/26 Python
在Python中构建增广矩阵的实现方法
2019/07/01 Python
Python切图九宫格的实现方法
2019/10/10 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
Html5页面二次分享的实现
2018/07/30 HTML / CSS
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
阿迪达斯英国官方网站:adidas英国
2019/08/13 全球购物
Android笔试题总结
2014/11/29 面试题
开放系统互连参考模型
2016/06/29 面试题
编辑求职信样本
2013/12/16 职场文书
农村党员一句话承诺
2014/05/30 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
python如何将mat文件转为png
2022/07/15 Python