偶然机会看到了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. spring mvc 思想

    目录 一.前言 二.spring mvc 核心类与接口 三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说 ...

  2. 使用OPtional的orElse()问题

    使用OPtional的orElse()问题 项目中有这样一段代码: return Optional.ofNullable(service.A()).orElse(service.B()) 1 功能显而 ...

  3. 阿里云简单的HTTPS配置

    1, 在CA证书服务中购买证书,填写信息,之后[域名授权配置]. 域名授权配置有两种,一种是文件配置,一种是DNS配置,这里我选择DNS配置. 记录类型:TXT 主机记录:按照上图填写 记录值:按照上 ...

  4. flask第十二篇——自定义url转换器【2】

    继续昨天的话题,今天我们来写一个手机号的转换器,方便大家理解 我们在`BaseConverter`源码里看到好多这种正则表达式: 正则表达式的目的就是规范匹配的规则,现在我们写一个简单的匹配手机号的正 ...

  5. coredns 编译模式添加插件

    备注:    coredns 默认已经安装了一些插件,比如大家用的多的kubernetes etcd ... 但是我们可以自己编译插件,构建我们自己的 coredns 版本,方便集成使用 1. 项目结 ...

  6. Apache Tez 了解

    你可能听说过Apache Tez,它是一个针对Hadoop数据处理应用程序的新分布式执行框架.但是它到底是什么呢?它的工作原理是什么?哪些人应该使用它,为什么?如果你有这些疑问,那么可以看一下Bika ...

  7. ZBar的简单使用

    NSRunLoop类声明的编程接口用于管理输入源对象.一个NSRunLoop对象处理像来自窗体系统中的鼠标和键盘事件,NSPORT对象和NSConnection连接对象这类的输入源.一个NSRunLo ...

  8. <>这个符号表示泛型的意思

    <>这个符号表示泛型的意思,泛型不是类而是类的模版 为什么是模版 这就与这个T有关了,如List<T> 这个T只是一个占位符,可以代表任意类型如 List<string& ...

  9. php array_push 与 $arr[]=$value 性能比较

    1.array_push方法 array_push 方法,将一个或多个元素压入数组的末尾. int array_push ( array &$array , mixed $var [, mix ...

  10. 【转】Linux 静态库与共享库的使用

    原文网址:http://blog.csdn.net/heyabo/article/details/11688517 申明: 正如题如示,本篇讲的是Linux下是静态库与共享库,而Window下的动态链 ...