PHP - 输出缓存 - 关于ob系列函数和flush函数
偶然机会看到了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函数的更多相关文章
- PHP输出控制函数(ob系列函数)
PHP输出控制函数(ob系列函数) flush — 刷新输出缓冲ob_clean — 清空(擦掉)输出缓冲区ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲ob_end_flush — ...
- PHP输出缓存ob系列函数
ob,输出缓冲区,是output buffering的简称,而不是output cache.ob用对了,是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额外的负担. ob的基本原则:如果 ...
- PHP输出缓存ob系列函数详解
PHP输出缓存ob系列函数详解 ob,输出缓冲区,是output buffering的简称,而不是output cache.ob用对了,是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额 ...
- PHP中ob系列函数讲解(浏览器缓存技术) (转)
Output Control 函数可以让你自由控制脚本中数据的输出.它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况. 输出控制函数不对使用 header() 或 setcooki ...
- PHP中ob系列函数整理
ob,输出缓冲区,是output buffering的简称,而不是output cache.ob用对了,是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额外的负担. 下面我说说ob的基本 ...
- PHP ob系列函数详解
一. 相关函数简介: 1.Flush:刷新缓冲区的内容,输出. 函数格式:flush() 说明:这个函数经常使用,效率很高. 2.ob_start :打开输出缓冲区 函数 ...
- PHP的OB缓存(输出缓存)
使用PHP自带的缓存机制 原则:如果ob缓存打开,则echo的数据首先放在ob缓存.如果是header信息,直接放在程序缓存.当页面执行到最后,会把ob缓存的数据放到程序缓存,然后依次返回给浏览器. ...
- ob系列函数归纳
输出控制函数(output control函数) flush — 刷新输出缓冲ob_clean — 清空(擦掉)输出缓冲区ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲ob_end_ ...
- PHP缓存技术OB系统函数(总结)
PHP缓存技术OB系统函数(总结) 一.总结 一句话总结: ob相比于php普通的文件操作多了缓存机制,所以适合做php的页面静态缓存 1.为什么php使用ob做静态文件缓存? 解决header()报 ...
随机推荐
- BZOJ4668 冷战 【LCT】
Description 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表"铁幕演说",正式拉开了冷战序幕. 美国和苏联同为世界上的"超级大国&quo ...
- HDU2896 病毒侵袭 【AC自动机】
HDU2896 病毒侵袭 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋--我们能在有生之年看到500年一 ...
- POJ3696 The Windy's 【网络流】
#include<iostream> #include<vector> #include<cstring> #include<algorithm> #i ...
- Sprint第一个冲刺(第十天)
一.Sprint介绍 更新工程部署文件:实现了云端登录:设计经营情况以及数据分析界面. 实验截图: 任务进度: 二.Sprint周期 看板: 燃尽图:
- Sprint第一个冲刺(第三天)
一.Sprint介绍 今天我们完成了简单登录界面及美化的任务,完成了此次整个Sprint的百分之十五. 下面是实验截图: 二.Sprint周期 看板: 燃尽图:
- Cocos2d-x学习笔记1
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u014734779/article/details/26077453 1.创建新的cocos2d-x ...
- FastAdmin 线上部署流程 (2018-05-03 更新)
FastAdmin 线上部署流程 首次部署 建立 git 环境. 建立 composer 环境. 建立 bower 环境. 将远程项目代码 git clone 到服务器上. 执行 composer i ...
- [LeetCode系列]3元素最近和问题的O(n^2)解法
给定一个整数数组(长度不小于3) 和 一个目标值, 从数组中找出3个元素, 使得它们的和与目标值最接近, 返回这个和. 可以认为每个输入的组合都是只有唯一解的. 解法思路参考: Finding thr ...
- sqlplus连接的三种方式
sys用户在cmd下以DBA身份登陆: sqlplus /nolog --运行sqlplus命令,进入sqlplus环境.其中/nolog是不登陆到数据库服务器的意思,如果没有/nolog参 ...
- C++内存管理原则
内存可分配的地方有2个: 栈Stack和堆Heap. 内存管理的方式有3种: RAII, 智能指针或者GC. 不推荐自己管理裸指针. C++的内存管理其实是一个哲学问题: 怎样才能确定一个东西没有被其 ...