偶然机会看到了flush()。知道他的神奇功能可以用在异步传输的comet 模式之后,于是我去试了试这个方法。然后翻手册去看了看什么意思。发现它神奇的和ob类函数在一起。有点好奇,先放一放,来说flush的作用。

手册上面这样说:

 flush() may not be able to override the buffering scheme   of your web server and it has no effect on any client-side buffering in the   browser.  It also doesn't affect PHP's userspace output buffering mechanism.   This means you will have to call both  ob_flush() and    flush() to flush the ob output buffers if you are using   those.  

我蹩脚地翻译一下

     flush()函数可能无法覆盖您的Web服务器的缓冲方案,它也不能影响任何客户端浏览器中的缓存。它也不会影响PHP的用户态输出缓冲机制,这意味着,如果你使用ob,你将不得不同时ob_flush()和flush()来刷新OB输出缓冲区。

     好,现在可能暂时并不是很理解这个到底是神马意思,没关系。先来看flush函数。

访问如下代码

<?php
$i = 0;
for($i;$i<10;$i++){
echo $i;
flush();
sleep(2);
}

我用的firefox访问的,尽然一直转,没有输出,一直运行了二十秒,我擦,不是说直接输出么。 好吧,我又蛋疼了。。然后打开firebug 看下network,继续刷页面,神奇的事情就发生了,居然一刷就有响应,并且响应是一步一步出来的每隔2秒钟多一个数字,看来PHP没坑我们。同时回顾他手册上说的 : 它也不能影响任何客户端浏览器中的缓存。恩,大概也就明白了,firefox也是有一定的缓存机制,没有遇到响应结束符号的时候是不会输出的。同样:函数可能无法覆盖您的Web服务器的缓冲方案。这个也能够明白一点点,也就是如果web服务器存在缓冲区的话应该也是不能够这样响应的。

OK,flush这个神奇的函数就搞定了。

突发奇想,不如用ob_flush来试一试行不行。

 <?php
$i = 0;
for($i;$i<10;$i++){
echo $i;
ob_flush();
sleep(2);
}

发现屁用没有,直接就输出了。不都是输出缓冲区么。

继续看一看手册,ob全在那里,确实让人蛋疼。在ob_start里面明确说明了一点:

This function will turn output buffering on. While output buffering is   active no output is sent from the script (other than headers), instead the   output is stored in an internal buffer.  

翻译一下:

此功能将开启输出缓冲。虽然输出缓冲区是存活的将不会有任何信息从脚本输出,而不是从脚本(标头以外)的输出被存储在内部缓冲器中。

经过他这么一说貌似好像ob的output buffering好像和那个并不是一个东西。 据我理解,本身php就是用缓冲的,比如无论我们是最开始的时候还是最后的时候echo something,总是到了脚本执行完了之后才会输出。这一点自己求证过。然而这种系统级别的缓冲并不能满足我们的需要,比如蛋疼的生成静态,好了伤心事不提。所以提供了一个ob的函数库来管理,(备注:ob是可以堆栈调用的。也就是嵌套)。当然只是猜想。运行如下代码:

 <?php
$i = 0;
ob_start();
for($i;$i<10;$i++){
echo $i;
$content .= ob_get_contents();
ob_flush();
flush();
sleep(2);
}
echo '<br />';
echo $content;

这样的代码应该就可以说明一些问题了。结果输出前十个数慢慢输出,最后十个脚本执行完成后输出,一次性。结果和预期一样。说明ob和flush不是在一层。显然也就证明了手册上面的:它也不会影响PHP的用户态输出缓冲机制,这意味着,,你将不得不同时ob_flush()和flush()来刷新OB输出缓冲区。如果你只使用了flush,如果你的浏览器返回 重载页面以获取资源的话那么说明你的flush被web server缓存了,也就是说你必须同时使用ob_flush()和flush()才能获取到

PHP - 输出缓存 - 关于ob系列函数和flush函数的更多相关文章

  1. PHP输出控制函数(ob系列函数)

    PHP输出控制函数(ob系列函数) flush — 刷新输出缓冲ob_clean — 清空(擦掉)输出缓冲区ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲ob_end_flush — ...

  2. PHP输出缓存ob系列函数

    ob,输出缓冲区,是output buffering的简称,而不是output cache.ob用对了,是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额外的负担. ob的基本原则:如果 ...

  3. PHP输出缓存ob系列函数详解

    PHP输出缓存ob系列函数详解 ob,输出缓冲区,是output buffering的简称,而不是output cache.ob用对了,是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额 ...

  4. PHP中ob系列函数讲解(浏览器缓存技术) (转)

    Output Control 函数可以让你自由控制脚本中数据的输出.它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况. 输出控制函数不对使用 header() 或 setcooki ...

  5. PHP中ob系列函数整理

    ob,输出缓冲区,是output buffering的简称,而不是output cache.ob用对了,是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额外的负担. 下面我说说ob的基本 ...

  6. PHP ob系列函数详解

    一. 相关函数简介:    1.Flush:刷新缓冲区的内容,输出.    函数格式:flush()    说明:这个函数经常使用,效率很高.    2.ob_start :打开输出缓冲区    函数 ...

  7. PHP的OB缓存(输出缓存)

    使用PHP自带的缓存机制 原则:如果ob缓存打开,则echo的数据首先放在ob缓存.如果是header信息,直接放在程序缓存.当页面执行到最后,会把ob缓存的数据放到程序缓存,然后依次返回给浏览器. ...

  8. ob系列函数归纳

     输出控制函数(output control函数) flush — 刷新输出缓冲ob_clean — 清空(擦掉)输出缓冲区ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲ob_end_ ...

  9. PHP缓存技术OB系统函数(总结)

    PHP缓存技术OB系统函数(总结) 一.总结 一句话总结: ob相比于php普通的文件操作多了缓存机制,所以适合做php的页面静态缓存 1.为什么php使用ob做静态文件缓存? 解决header()报 ...

随机推荐

  1. BZOJ2724 蒲公英 【分块】

    BZOJ2724 蒲公英 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被 ...

  2. 应该抛出什么异常?不应该抛出什么异常?(.NET/C#)

    我在 .NET/C# 建议的异常处理原则 中描述了如何 catch 异常以及重新 throw.然而何时应该 throw 异常,以及应该 throw 什么异常呢? 究竟是谁错了? 代码中从上到下从里到外 ...

  3. GitHub项目为己所用

    1.下载 2.cmd  进入文件夹 3.mvn clean package 4.mvn install

  4. Spark执行样例报警告:WARN scheduler.TaskSchedulerImpl: Initial job has not accepted any resources

    搭建Spark环境后,调测Spark样例时,出现下面的错误:WARN scheduler.TaskSchedulerImpl: Initial job has not accepted any res ...

  5. linux 系统下配置maven环境

    1.首先到Maven官网下载安装文件,目前最新版本为3.0.3,下载文件为apache-maven-3.0.3-bin.tar.gz,下载可以使用wget命令: 2.解压源码包 通过终端在/usr/l ...

  6. 几种分布式调用技术的比较 -- RPC VS REST

    我之前在传统IT公司干活,后来来了互联网,感受到了很多不同,其中有一点就是两者使用到的技术有一些差别.比如说分布式调用技术. 我在的这家公司内部的服务架构是基于Thrift的,服务基于Thrift进行 ...

  7. WPF绘制简单常用的Path(转)

    写代码出身的我们经常需要使用一些简单 但是不是规则图形的Path 但限于美工功底有限 不知道怎么去画 下面我告诉大家一些简单的小技巧 用代码来画Path 个人还是比较喜欢用代码 因为数值控制的更精细 ...

  8. HAL层编写规范

    andriod HAL模块也有一个通用的入口地址,这个入口地址就是HAL_MODULE_INFO_SYM变量,通过它,我们可以访问到HAL模块中的所有想要外部访问到的方法.  在Linux系统中,后缀 ...

  9. 搭建基于hyperledger fabric的联盟社区(六) --搭建node.js服务器

    接下来我要做的是用fabric sdk来做出应用程序,代替CLI与整个区块链网络交互.并且实现一个http API,向社区提供一个简单的接口,使社区轻松的与区块链交互. 官方虽然提供了Node.JS, ...

  10. rtesseract的例子

    这个是用来验证码识别的 需要先装一下这些 brew install Tesseract brew install imagemagick gem install rmagick 测试代码 requir ...