偶然机会看到了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. parcel vue 简单使用

    1.安装依赖 yarn global add parcel-bundler yarn add babel-preset-env --dev yarn add parcel-plugin-vue --d ...

  2. orientdb 图数据库docker 安装试用

    1. 镜像 docker pull orientdb 2. 启动 docker run -d --name orientdb -p 2424:2424 -p 2480:2480 -e ORIENTDB ...

  3. jekyll 安装使用

    1. 安装     条件: ruby gem 注意版本,同时建议使用国内的镜像 gem install jekyll bundler   2. 创建网站   jekyll new my-awesome ...

  4. UVA12716 GCD XOR 数论数学构造

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u010682557/article/details/36204645 题目给你一个N,让你求 两个数 ...

  5. [LeetCode系列]爬梯问题的递归解法转换为迭代解法

    有一个n阶的梯子, 你每次只能爬1阶或2阶, 请问共有多少种登顶的爬法?(正好爬完n阶, 不能多也不能少) 本题最优解是直接套用菲波那切数列即可(因为菲波那切数列的第n个元素正好等于第n-1个元素和第 ...

  6. 简明 Python 教程--学习记录

    注意,我们在print语句的结尾使用了一个 逗号 来消除每个print语句自动打印的换行符.这样做有点难看,不过确实简单有效. print # prints a blank line 注意,没有返回值 ...

  7. Oracle 11gR2 RAC集群服务启动与关闭总结

    引言:这写篇文章的出处是因为我的一名学生最近在公司搭建RAC集群,但对其启动与关闭的顺序和原理不是特别清晰,我在教学工作中也发现了很多学员对RAC知识了解甚少,因此我在这里就把RAC里面涉及到的最常用 ...

  8. 轻量级封装DbUtils&Mybatis之二Dbutils

    DbUtils入门 Apache出品的极为轻量级的Jdbc访问框架,核心类只有两个:QueryRunner和ResultSetHandler. 各类ResultSetHandler: ArrayHan ...

  9. Js、jquery学习笔记

    end() 方法 重新定位到上次操作的元素,一般与siblings()一起使用,操作其兄弟元素.如:$(this).addClass("highlight").children(& ...

  10. CMapStringToPtr添加与释放

    // 创建MapStringToPtr CMapStringToPtr m_prjFiles; CStringList m_fileList; m_fileList.AddTail(_T(" ...