php中flush和ob
php中flush和ob_flush的区别 (2011-11-11 15:31:17) ▼ php flush ob_flush 区别 杂谈 分类: PHP buffer ---- flush() buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的设备之间传
php中flush和ob_flush的区别
(2011-11-11 15:31:17)▼
phpflushob_flush区别杂谈 |
分类:PHP |
buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的设备之间传办理数据的区域。通过buffer,可以使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每输入一个字符,操作系统并不会立即把这个字符直接写入到磁盘,而是先写入到buffer,当写满了一个buffer的时候,才会把buffer中的数据写入磁盘,当然当调用内核函数flush()的时候,强制要求把buffer中的脏数据写回磁盘。
同样的道理,当执行echo,print的时 候,输出并没有立即通过tcp传给客户端浏览器显示, 而是将数据写入phpbuffer。php output_buffering机制,意味在tcpbuffer之前,建立了一新的队列,数据必须经过该队列。当一个php buffer写满的时候,脚本进程会将phpbuffer中的输出数据交给系统内核交由tcp传给浏览器显示。所以,数据会依次写到这几个地方echo/pring-> php buffer -> tcp buffer-> browser
默 认情况下,phpbuffer是开启的,而且该buffer默认值是4096,即1kb。你可以通过在php.ini配置文件中找到output_buffering配置.当echo,print等输出用户数据的时候,输出数据都会写入到phpoutput_buffering中,直到output_buffering写满,会将这些数据通过tcp传送给浏览器显示。你也可以通过ob_start()手动激活phpoutput_buffering机制,使得即便输出超过了1kb数据,也不真的把数据交给tcp传给浏览器,因为ob_start()将phpbuffer空间设置到了足够大
这两个函数的使用怕是很多人最迷惑的一个问题,手册上对两个函数的解释也语焉不详,没有明确的指出它们的区别,似乎二者的功能都是刷新输出缓存。但在我们文章一开始的代码中如果讲fush()替换成ob_flush(),程序就再不能正确执行了。显然,它们是有区别的,否则也手册中直接说明其中一个是另外一个函数的别名即可了,没必要分别说明。那么它们的区别到底是什么呢?
在没有开启缓存时,脚本输出的内容都在服务器端处于等待输出的状态
开 启缓存后,脚本输出的内容存入了输出缓存中
一.
ob_flush();
flush();
如果Web服务器的操作系统是windows系统,那顺序颠倒或者不使用ob_flush()也不会出现问题。[有待求证
1.bool
激活output_buffering机制。一旦激活,脚本输出不再直接出给浏览器,而是先暂时写入php buffer内存区域。
php默认开启output_buffering机制,只不过,通过调用ob_start()函数据output_buffering值扩展到足够大
当然,你可以通过指定$ouput_callback,来处理buffer中的数据。比如函数ob_gzhandler,将buffer中的数据压缩后再传送给浏览器。
第三个参数:是否擦除缓存,可选,默认是true,如果设置为false,则在脚本执行结束前,缓存都不会被清除。
2.ob_get_contents
获取一份phpbuffer中的数据拷贝。值得注意的是,你应该在ob_end_clean()函数调用前调用该函数,否则ob_get_contents()返回一个空字符中。
可以使用ob_get_contents()以字符串形式获取服务端缓存的数据,
使用ob_end_flush()则会输出被缓存起来的数据,并关闭缓存。
而使用ob_end_clean()则会静默的清除服务端缓存的数据,而不会有任何数据或其他行为。
服务端的缓存是堆叠起来的,也就是说你在开启了ob_start()后,关闭之前,在其内部还
不过你也要务必保证关闭缓存的操作和开启缓存的操作数量一样多。
ob_start()可以指定一个回调函数来处理缓存数据,如果一个ob_start()内部嵌套了另一个ob_start(),我们假定,外层的ob_start(),编号是A,内层的ob_start()编号是B,它们各自制定了一个回调函数分别是functionA和functionB,那么在缓存B中的数据输出时,它会先辈funcitonB回调函数处理,再交给外层的functionA回调函数处理,之后才能输出到客户端。
另外,手册说,对于某些web服务器,比如apache,在使用回调函数有可能会改变程序当前的工作目录,解决方法是在回调函数中自行手动把工作目录修改回来,用chdir函数,这点似乎不常遇到,遇到的时候记得去查手册吧。
3.ob_end_flush与ob_end_clean
这 二个函数有点相似,都会关闭ouptu_buffering机制。但不同的是,ob_end_flush只是把phpbuffer中的数据冲(flush/send)到客户端浏览器,而ob_clean_clean将phpbufeer中的数据清空(erase),但不发送给客户端浏览器。
ob_end_flush调用之前
而ob_end_flush()调用之后
而使用ob_end_clean()则会静默的清除服务端缓存的数据,而不会有任何数据或其他行为。
推荐阅读
-
PHP面向对象中关于选择工厂和更新工厂
-
php中ob_start系列函数的使用
-
php中static关键字对变量和函数影响
-
php中ob_get_length缓冲函数用法实例详解
-
php中echo()和print()、require()和include()等易混淆函数的区别
-
浅析ThinkPHP中execute和query方法的区别_PHP教程
-
php中foreach和list循环语句实例
-
ThinkPHP中公共函数路径和配置项路径的映射分析_PHP
-
phpstorm中js和php代码混用有错误提示,但是其实没问题,怎么关闭呢?
-
windows 2003 server php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别