PHP中输出缓冲
在PHP中,当运行echo,print的时候,输出并没有马上通过tcp传给client浏览器显示, 而是将数据写入php buffer。php output_buffering机制,意味在tcp buffer之前,建立了一新的队列,数据必须经过该队列。当一个php buffer写满的时候,脚本进程会将php buffer中的输出数据交给系统内核交由tcp传给浏览器显示。所以,数据会依次写到这几个地方echo/pring -> php buffer -> tcp buffer -> browser
在PHP中与刷新缓冲相关的函数有三个:
1). flush
刷新PHP程序的缓冲,而不论PHP运行在何种情况下。该函数将当前为止程序的全部输出发送到用户的浏览器。 可是该函数不会对server或client浏览器的缓存模式产生不论什么影响,也不会对PHP本身的缓存产生不论什么影响。
2).ob_flush
该函数对PHP本身的的缓存进行输出。PHP本身的缓存受php.ini中的output_buffering的控制。ob_flush()的作用就是将本来存在输出缓存中的内容取出来,设置为等待输出状态,但不会直接发送到client,这时你就须要先使用ob_flush()再使用flush(),client才干马上获得脚本的输出。
与PHP本身输出缓冲相关的两个PHP配置是:
參数1:output_buffering :on/off 或 者整数 。设置为on时,将在全部脚本中使用输出缓存控制,不限制缓存的大小。而设置为整数时,如output_buffering=4096,当缓存数 据达到4096字节时会自己主动输出刷新缓存。而这个參数的不同正是导致以上代码在不同一时候候运行结果不同的原因。当output_buffering关闭时, 脚本全部的输出(echo)都会即时发送到client,运行上面代码时就是每秒输出一个数字。而开启output_buffering后,输出内容就会先缓存
在服务端,直到脚本结束时才一起发送给client。
參数2:implicit_flush:on/off。设定ON意味着,当脚本有输出时,自己主动马上发送到client。相当于在echo后自己主动加flush()。
3).ob_implicit_flush
这个函数强制每当有输出的时候,即刻把输出发送到浏览器。这样就不须要每次输出(echo)后,都用flush()来发送到浏览器了。
样例
- <?php
- ob_end_clean();
- echo str_pad(" ", 256);
- for ($i=100; $i>0; $i--) {
- echo $i, '<br/>';
- flush();
- sleep(1);
- }
- ?>
以上代码应该隔一秒钟输出一次$i. 以上echo
str_pad(" ", 256)的目的是IE须要接受到256个字节之后才開始显示。 以上代码还有下面两种写法。
- <?php
- echo str_pad(" ", 256);
- for ($i=100; $i>0; $i--) {
- echo $i, '<br />';
- ob_flush(); //有时候仅仅有flush是不行的
- flush();
- sleep(1);
- }
- ?>
- <?php
- ob_implicit_flush(true);
- echo str_pad(" ", 256);
- for ($i=100; $i>0; $i--) {
- echo $i, '<br />';
- ob_flush();
- sleep(1);
- }
- ?>
另外我们还须要注意刷新缓冲不光受以上几方面的影响,还受下面影响:
1). 个别webserver程序,特别是Win32下的webserver程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。有些Apache的模块,比方mod_gzip,可能自己进行输出缓存,这将导致flush()函 数产生的结果不会马上被发送到client浏览器。甚至浏览器也会在显示之前,缓存接收到的内容。比如 Netscape 浏览器会在接受到换行或 html
标记的开头之前缓存内容,而且在接受到 </table> 标记之前,不会显示出整个表格。一些版本号的 Microsoft Internet Explorer 仅仅有当接受到的256个字节以后才開始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
以下是非常easy的一段代码
<?php
/*--------------------编写自己的缓存类---------------*/
class my_cache{ //定义有关变量
private $cache_time;//缓存有效时间
private $cache_file;//缓存文件保存路径 //初始化类,默认是index.html时间是1
function __construct($cache_file='index.html',$cache_time="1"){
$this->cache_file=$cache_file;
$this->cache_time=$cache_time;
}
//缓存開始
function cache_start(){ if ($this->cache_active){
include($this->cache_file);
exit;
}
//开启缓存
ob_start(); } //推断缓存文件是否存在而且可用
function cache_active(){
//推断文件是否存在
if(file_exists($this->cache_file)){
$last_time=@filemtime($this->cache_file);//获取最后改动时间
//推断时间是否可用
if($this->cache_time<$last_time){
//可用,包括进来直接显示
return true;
}else{
//删除该缓存,又一次建立缓存
unlink($this->cache_file);
return false;
}
}
} //进行缓存文件夹的生成
function cache_creat(){
//不用推断直接生成缓存文件文件夹及文件,循环生成文件
$file=explode("/", $this->cache_file);
$num=count($file)-1;
for ($i=0;$i<$num;$i++){
$tm.=$file[$i]."/";
if (!file_exists($tm)){
mkdir($tm);
}
}
} //缓存的输出
function cache_end(){
$cache_content=ob_get_contents();
$this->cache_creat();
$fp=@fopen($this->cache_file, "w+");
fwrite($fp, $cache_content);
ob_end_flush();
} //缓存的清除
function cache_clean(){
if(unlink($this->cache_file)){
return true;
}else {
$this->alert("缓存删除失败!请检查缓存文件是否存在");
return false;
} } //定义缓存文件的提醒函数
function alert($a){
echo "<script>alert('$a');</script>"; }
}
?> 測试页面test.php <?
include 'cache_my_class.php';
$my_cache=new my_cache("./chunge/ge/hao/index.html",5);
$my_cache->cache_start(); //在页面的最開始 -------页面输出 $like="我爱吃橘子香蕉!";
echo $like."<br>";
$my_cache->cache_end();//最后进行输出
PHP中输出缓冲的更多相关文章
- PHP中刷新输出缓冲
http://www.cnblogs.com/mutuan/archive/2012/03/18/2404957.html PHP中刷新输出缓冲buffer是一个内存地址空间,Linux系统默认大小一 ...
- (转载)PHP中刷新输出缓冲
(转载)http://www.cnblogs.com/mutuan/archive/2012/03/18/2404957.html PHP中刷新输出缓冲buffer是一个内存地址空间,Linux系统默 ...
- PHP中刷新输出缓冲详解[转载]
PHP中刷新输出缓冲详解 分类: PHP Web开发2011-07-23 17:42 1795人阅读 评论(0) 收藏 举报 phpbuffer浏览器outputapache模块脚本 buffer是一 ...
- PHP中的输出缓冲控制
在 PHP 中,我们直接进行 echo . 或者 print_r 的时候,输出的内容就会直接打印出来.但是,在某些情况下,我们并不想直接打印,这个时候就可以使用输出缓冲控制来进行输出打印的控制.当然, ...
- PHP输出缓冲(Output Buffering)
什么是缓冲区? 简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题~其实缓冲区最本质的作用就是,协调高速CPU和相对缓慢的IO设备 ...
- PHP 输出缓冲控制(Output Control) 学习
php 缓冲简介 其实我对php ob 系列印象还是很模糊,具体怎么玩的,还不是很了解,平时curd,确实对这些内容没有深入.作为phper 甚是惭愧.网上搜了一通,互相copy,代码运行不能出现作者 ...
- php flush()刷新不能输出缓冲的原因分析
在php程序编写中,flush()的使用率还是挺高的,它在网页表现即时信息效果时发挥了极为重要的作用,比如之前写的php实现限制文件下载速度的代码实例,flush()就起了举足轻重的作用,是进度条实现 ...
- PHP输出缓冲控制
说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会 向磁盘写入的,而是写到buffer中,当buffer写 ...
- PHP输出缓冲控制- Output Control 函数应用详解
说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会向磁盘写入的,而是写到buffer中,当buffer写满 ...
随机推荐
- iOS 推荐博客
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Franz Fang链接:http://www.zhihu.com/question/20264108/answer/3026 ...
- extjs中第一次访问有效,第二次访问出现部分组件无法显示的,动态改变组件的label值的方法,ExtJs中组件最好少使用ID属性(推荐更多使用Name属性)
在公司做的一个OA项目中,曾经就遇到了这样的一个问题:(我是在jsp中的div中将js render到div中去的)第一次访问此界面的时候,formpanel上的组件能正常显示,不刷新整个页面的前提下 ...
- Hibernate一对一双向关联(外键)
网站上各种搜索,都是一些清晰或者不清晰的例子,但是用下来一是确实不给力,二是完全不知道所以然. 后来终于在书中查到了就在这里记一下. 首先要说明,这里只解释双向一对一只有一个表里面有外键的情况. 就以 ...
- java版 正文抽取 基于文字连接比
package cn.tdt.crawl.jdbc; import java.util.regex.Matcher; import java.util.regex.Pattern; import or ...
- pythom 安装MySQL-pythom的问题
链接一:http://blog.csdn.net/dqatsh/article/details/2418663 链接二:http://codingnow.cn/language/159.html 链接 ...
- BZOJ 1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富
Description 最近,奶牛们热衷于把金币包在面粉里,然后把它们烤成馅饼.第i块馅饼中含有Ni(1<=Ni<=25)块金币,并且,这个数字被醒目地标记在馅饼表面. 奶牛们把所有烤好的 ...
- ubuntu修改grub2
转自修改系统启动项 grub2配置的方法 ubuntu 在早期的Ubuntu中,使用Grub作为系统的启动引导程序,想修改系统启动项非常简单,只要用gedit打开系统菜单设定文件( sudo gedi ...
- 【POJ 3162】 Walking Race (树形DP-求树上最长路径问题,+单调队列)
Walking Race Description flymouse's sister wc is very capable at sports and her favorite event is ...
- 【Xamarin挖墙脚系列:卸载不彻底的解决】
原文:[Xamarin挖墙脚系列:卸载不彻底的解决] 卸载后,再次安装,总是授权还是原来的.请手工删除下文件: 卸载程序后 必须手工删除C:\ProgramData\Mono for Android\ ...
- unicode转中文
<pre name="code" class="html">[root@dr-mysql01 ~]# cat a1.pl my $str=" ...