通行证: 用户 密码 网站建设  下载中心 社区论坛 信息公告 MY小屋
联系我们
设为首页
加入收藏

 

QQ,ASP,PHP,JSP,XML,SQL,.Net,编程 程序 网页图象 建站经验 私服
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿
论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图
专题 | 应用软件 | 聊天通讯 | Q Q 专栏 | 建站经验 | 在线工具 | 站长Club | 注 册 表 | 旧版
社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务
当前位置:首页>>编程开发>>PHP专区>>正文 新版上线![旧版]
注:打开慢时请稍等

剖析PHP中的输出缓冲

http://www.iyit.net  日期:2006-12-18 15:22:45  来源:  点击:
参加讨论

我们先来看一段代码。

<?php
for ($i=10; $i>0; $i--)
{
 echo $i;
 flush();
 sleep(1);
}
?>
按照php手册里的说法

该函数将当前为止程序的所有输出发送到用户的浏览器。

上面的这段代码,应该隔一秒钟输出一次$i。但是实际中却不一定是这样。有可能是等了10秒钟后,所有的输出同时呈现出来。

好,我们来改一下这段代码,改成

<?php
ob_end_clean();//修改部分
for ($i=10; $i>0; $i--)
{
 echo $i;
 flush();
 sleep(1);
}
?>
嘿,加了这一句ob_end_clean();,居然就OK了。实际上,我们把ob_end_clean()换成ob_end_flush()也一样OK。

我再来改一改。

<?php
for ($i=10; $i>0; $i--)
{
 echo $i;
 ob_flush();//修改部分
 flush();
 sleep(1);
}
?>
运行一下,是不是发现$i也隔一秒输出一次了?这是为什么呢?
别急,我们来看看php.ini。

打开php.ini,搜索output_buffering,我们会看到类似这样的设置 output_buffering = 4096。正如它的名字output_buffering一样,这个设置的作用就是把输出缓冲一下,缓冲大小为4096bytes.

在我们的第一段代码里,之所以没有按预期的输出,正是因为这个output_buffering把那些输出都缓冲了。没达到4096bytes或者脚本结束,输出是不会被发送出去的。

而第二段代码中的ob_end_clean()和ob_end_flush()的作用,就是终止缓冲。这样就不用等到有4096bytes的缓冲之后才被发送出去了。

第三段代码中,用了一句ob_flush(),它的作用就是把缓冲的数据发送出去,但是并不会终止缓冲,所以它必须在每次flush()前使用。

如果不想使用ob_end_clean(),ob_end_flush()和ob_flush(),我们就必须把php.ini里的output_buffering设得足够小,例如设为0。需要注意的是,如果你打算在脚本中使用ini_set(”output_buffering”,”0″)来设置,那么请停下来吧,这种方法是不行的。因为在脚本一开始的时候,缓冲设置就已经被载入,然后缓冲就开始了。

可能你会问了,既然ob_flush()是把缓冲的数据发送出去,那么为什么还需要用flush()???直接用下面这段代码不行吗??

<?php
for ($i=10; $i>0; $i--)
{
 echo $i;
 ob_flush();
 sleep(1);
}
?>
请注意ob_flush()和flush()的区别。前者是把数据从PHP的缓冲中释放出来,后者是把不在缓冲中的或者说是被释放出来的数据发送到浏览器。所以当缓冲存在的时候,我们必须ob_flush()和flush()同时使用。

那是不是flush()在这里就是不可缺少的呢?不是的,我们还有另外一种方法,使得当有数据输出的时候,马上被发送到浏览器。下面这两段代码就是不需要使用flush()了。(当你把output_buffering设为0的时候,连ob_flush()和ob_end_clean()都不需要了)

<?php
ob_implicit_flush(true);
for ($i=10; $i>0; $i--)
{
 echo $i;
 ob_flush();
 sleep(1);
}
?>
<?php
ob_end_clean();
ob_implicit_flush(true);
for ($i=10; $i>0; $i--)
{
 echo $i;
 sleep(1);
}
?>
请注意看上面的ob_implicit_flush(true),这个函数强制每当有输出的时候,即刻把输出发送到浏览器。这样就不需要每次输出(echo)后,都用flush()来发送到浏览器了。

以上所诉可能在某些浏览器中不成立。因为浏览器也有自己的规则。我是用Firefox1.5,IE6,opera8.5来测试的。其中opera就不能正常输出,因为它有一个规则,就是不遇到一个HTML标签,就绝对不输出,除非到脚本结束。而FireFox和IE还算比较正常的。

最后附上一段非常有趣的代码,作者为PuTTYshell。在一个脚本周期里,每次输出,都会把前一次的输出覆盖掉。
以下代码只在firefox下可用,其他浏览器并不支持multipart/x-mixed-replace的Content-Type.

本新闻共2页,当前在第1页  1  2  


编辑: [发送给好友] [打印本页] [关闭窗口] [返回顶部]
上一篇:Win2000下PHP服务器安装攻略
下一篇:没有了
转载请注明来源:www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。

 相关文章
Win2000下PHP服务器安装攻略 IIS环境下安装PHP5手记全攻略 PHP5:session会话的使用和分析
PHP和ASP上传漏洞探究 php作wap开发时遇到的问题  我在windows  XP上安装apache2.044+php
Apache+php,怎样打开session支持?? 在linux中怎么配置pdflib和php  高分! 怎么样同时解释.php和.php3的文件呀,急
PHP 4.1.0 及以后版本使用POST变量的接 Apache2-Win32+PHP的成功安装方法 我只是想在本地机上学习php ,还要安装
装了PHP。运行时出现在以下提示 PHP在Win2003上面怎样安装? php 在Linux 下如何開啟ftp功能
如何屏蔽掉 phpinfo() php.ini中文版 请问怎样降低php的警告等级?
一个打击了我学习php热情的问题:怎么样 PHP初学者的入门问题 运行php程序会出现乱码是怎么回事?Zen
如何让php拥有root的权限? 为什么php中的函数mail()不能发送邮件 成功地在linux/unix下安装apache+php+o
最新更新 热点排行 推荐新闻
剖析PHP中的输出缓冲
Win2000下PHP服务器安装攻略
IIS环境下安装PHP5手记全攻略
PHP5:session会话的使用和分析
PHP和ASP上传漏洞探究
剖析PHP中的输出缓冲
新版宠物饥饿值和清洁值计算方式
QQ宠物活跃度增长数据揭密
首次用服务器的站长常犯的错误
如何禁止flash动画的自动跳转
终端服务器超出了最大允许连接数的解决
如何避免出现“终端服务器超出了最大允
 Windows 2003下域服务器的管理与配置
系统防御全攻略3.防火墙篇 
Perl格式串处理整数溢出漏洞
PHP5:session会话的使用和分析
Win2000下PHP服务器安装攻略
IIS环境下安装PHP5手记全攻略
剖析PHP中的输出缓冲
最新永久免费网游年列表,免费3d网游
永久免费网游《刀OL》11月3日开放新服
远程破解盗窃QQ密码的各种方法
windows下如何修改右键菜单
安装IE7.0密技 绕过WGA 完美轻松搞定
msn8.0下载、msn shell、msn8.0中文版
流氓软件清理助手下载
应用readyboost实测闪存是否能提高VIS
ASP 域名查询系统代码
QQ被盗到出售过程详解
Win2000下PHP服务器安装攻略
IIS环境下安装PHP5手记全攻略
PHP5:session会话的使用和分析
PHP和ASP上传漏洞探究
如何禁止flash动画的自动跳转
合理的网页设计具有哪些特征
从基础到精通:CSS实用教程(三)
从基础到精通:CSS实用教程(二)
从基础到精通:CSS实用教程(一)
CSS基础学习:样式表CSS简明教程
CSS样式表:详细介绍IE7新支持的选择器
Photoshop创意壁纸教程
著名的SQL流量注入(SQL注入)攻击法 
50种方法巧妙优化你的SQL Server数据库

设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyrights © 2004-2006 iYiT.Net All Rights Reserved.
网站合作、广告联系QQ:147007642、466949678
易特网络技术 点击这里给我发消息