首頁 > 後端開發 > php教程 > php output_buffering 快取使用介紹

php output_buffering 快取使用介紹

WBOY
發布: 2016-07-25 08:55:20
原創
1335 人瀏覽過
  1. for($i=0; $i<10; $i ){
  2. echo $i.'
    ';
  3. sleep(2);
  4. }
  5. ?>
复制代码

运行结果:等所有脚本全部运行完成后,才输出,因为数据未满一个buffer的大小。

例2,output_buffering=4096,输出较少的数据(少于一个buffer),关闭output_buffering,修改php.ini的output_buffering=0

  1. for($i=0; $i<10; $i ){
  2. echo $i.str_repeat(" ",500).'
    '; // 当接受到的256(甚至更多)个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
  3. flush();
  4. sleep(1);
  5. }
  6. ?>
复制代码

运行结果: 因为禁用了php buffering,不需要等到脚本运行完毕就可以输出,数据没有在php buffer停留,可以看到断断续续间歇性输出。 echo -> tcp buffer ->browser

例3,当output_buffering=4096,输出较大数据(大于一个buffer),不使用ob_start()

  1. for($i=0; $i<10; $i ){
  2. echo file_get_contents('f.txt').$i.'
    ';
  3. sleep(1);
  4. }
  5. ?>
复制代码

运行结果: f.txt为一个大于4kb的文件,因为大于buffer默认值,buffer空间不够用,每当满一个buffer就会输出,所以可以看到间歇性输出。

例4,当output_buffering=4096,输出较大数据(大于一个buffer),使用ob_start()

  1. ob_start();
  2. for($i=0; $i<10; $i ){
  3. echo file_get_contents('f.txt').$i.'
    ';
  4. sleep(1);
  5. }
  6. ?>
复制代码

运行结果: 因为使用了ob_start(),会为buffer设置足够大的空间,因此会保存到脚本执行完毕后才会输出。

output_buffering 方法 1.ob_start 激活output_buffering机制,一旦激活,脚本不再直接输出到浏览器,而是暂时写入php buffering区域。直到脚本运行完毕后,才发送。

2.ob_get_contents 获取php buffering中的数据,注意:要在ob_end_clean()前调用,否则只会得到空字符。

3.ob_end_flush 和 ob_end_clean ob_end_flush 会输出php buffering 中的数据,但不会清空。 ob_end_clean 不会输出,只会清空php buffering中的数据。

注意: ob_flush/flush在手册中的描述,都是刷新输出缓冲区,并且还需要配套使用。 其实, 他们俩的操作对象不同, 有些情况下, flush根本不做什么事情。

ob_*系列函数, 是操作PHP本身的输出缓冲区. 所以, ob_flush是刷新PHP自身的缓冲区。

而flush, 严格来讲, 这个只有在PHP做为apache的Module(handler或者filter)安装时,才有实际作用。 它是刷新WebServer(可以认为特指apache)的缓冲区. 在apache module的sapi下, flush会通过调用sapi_module的flush成员函数指针,间接调用apache的api: ap_rflush刷新apache的输出缓冲区。

有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。 甚至浏览器也会在显示之前,缓存接收到的内容。

例如,Netscape浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到

標記之前,不會顯示整個表格。 某些版本的 Microsoft Internet Explorer 只有在接受到的256個位元組以後才開始顯示該頁面,所以必須傳送一些額外的空格來讓這些瀏覽器顯示頁面內容。

正確的使用順序為:先ob_flush,後flush。 當然,在其他sapi下,不呼叫flush也可以,只不過為了保證程式碼的可移植性,建議配套使用。



來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板