《PHP实战:PHP 输出缓冲控制(Output Control)详解》要点:
本文介绍了PHP实战:PHP 输出缓冲控制(Output Control)详解,希望对您有用。如果有疑问,可以联系我们。
相关主题:PHP开发
PHP教程 php 缓冲简介
PHP教程
其实我对php ob 系列印象还是很模糊,具体怎么玩的,还不是很了解,平时curd,确实对这些内容没有深入.作为phper 甚是惭愧.网上搜了一通,互相copy,代码运行不能出现作者所描述现象,本文良心出品,代码都是作者运行过.
PHP教程 当执行输出的时候,比如 echo,print.输出并没有立即送给 web server, 而是将数据写入 php buffer.php output_buffering 机制好处当然提升性能.其实 php 文件最终在浏览器上显示,走过3个缓冲阶段: php buffer=》web server buffer=》browser buffer. 最后显示到浏览器
PHP教程 默认情况下,php buffer 是开启的,而且该 buffer 默认值是4096,即4 kb.你可以通过在php.ini配置文件中找到output_buffering配置.buffer是一个内存地址空间,Linux系统默认大小一般为4096(4kb),即一个内存页.主要用于存储速度不同步的设备或者优先级不同的设备之间传办理数据的区域.通过buffer,可以使进程这间的相互等待变少.这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每输入一个字符,操作系统并不会立即把这个字符直接写入到磁盘,而是先写入到buffer,当写满了一个buffer的时候,才会把buffer中的数据写入磁盘,当然当调用内核函数flush()的时候,强制要求把buffer中的脏数据写回磁盘.
PHP教程 举个例子
PHP教程 <?php echo "这是测试<br>"; header("content-type:text/html;charset='utf-8'"); echo "这是测试!"; //output //这是测试 //这是测试!
PHP教程header()必须在任何实际输出之前调用,但是我们程序已经输出了,却正常运行.在看下面的代码:
PHP教程 <?phpecho "这是测试<br>"; ob_flush(); header("content-type:text/html;charset='utf-8'"); echo "这是测试!"; //output //这是测试 //Cannot modify header information - headers already sent by (output started at E:\php\test.php:3)
PHP教程上面程序说明程序并没有立即输出,而当调用ob_flush 函数的时候才刷新缓冲,输出.
PHP教程 ob_flush() 与 flush()
PHP教程ob_flush() , flush() 函数php 手册上都有详细的说明,你可以去查阅一下.二者的区别是:
PHP教程ob_flush() 是刷新PHP自身的缓冲区
PHP教程flush()是 它是刷新WebServer 服务器的缓冲.输出到浏览器.但是会出现下面的情况:
个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止.
有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器.
甚至浏览器也会在显示之前,缓存接收到的内容.例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格.
一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容.
PHP教程 比如:
PHP教程<?php /** Server:LightTPD/1.4.28 (Win32) X-Powered-By:PHP/5.3.27 */ echo '这是测试'."<BR>"; ob_flush(); flush(); sleep(1); echo '这是测试'; //output
PHP教程上面的代码 在 chrome 浏览器上面 是一行一行的输出,在ie系列的浏览器则是全部输出.其实就是上面的 第四条一些浏览器只有当接收256个字符才开始显示.把上面的代码改成下面形式:
PHP教程 <?php /** Server:LightTPD/1.4.28 (Win32) X-Powered-By:PHP/5.3.27 */ echo str_pad('',240)."\n"; echo '这是测试'."<BR>"; ob_flush(); flush(); sleep(1); echo '这是测试'; //output
PHP教程这样在ie下面就会一行一行输出,因为超过256个字符.
PHP教程 ob 其他函数说明
PHP教程1.ob_end_flush 与 ob_end_clean
PHP教程 end 的顾名思义就结束,关闭缓冲区,都是关闭输出缓冲,一个是输出缓冲区,一个是清除.比如
PHP教程<?php /** Server:LightTPD/1.4.28 (Win32) X-Powered-By:PHP/5.3.27 */ echo 'before'; ob_end_clean(); echo str_pad('',4096)."\n"; for ($i=10; $i>0; $i--) { echo $i; sleep(1); }
PHP教程上述代码是一下输出全部内容,而不是一个一个输出.ob_end_clean() 不是关闭了缓冲了?怎么不是一个一个输出呢,其实我们上面也说了,php 不是直接输出给浏览器,而是 web server. 虽然php 没有了 缓冲.但是web server 还是有的.所以下面代码:
PHP教程/** Server:LightTPD/1.4.28 (Win32) X-Powered-By:PHP/5.3.27 */ echo 'before'; ob_end_clean(); echo str_pad('',4096)."\n"; for ($i=10; $i>0; $i--) { flush(); echo $i; sleep(1); }
PHP教程加上flush(),就会一行一行输出. 如果把ob_end_clean 换成 ob_end_flush 会把 before 输出来.
PHP教程其他函数 可参考手册,比较简单.
PHP教程 总结
PHP教程php 脚本到浏览器,要经过 php buffer=》web server buffer=》browser buffer. 最后显示到浏览器. 缺一不可. 所以我们要 ob_flush 和 flush 以及加上 echo str_pad('',4096) 才能调试出你想要的效果.
PHP教程以上就是对PHP 缓冲的资料整理后续继续补充相关资料,谢谢大家对本站的支持!
转载请注明本页网址:
http://www.vephp.com/jiaocheng/3983.html