php内部缓存 – output_buffering ob_flush flush...
时间:2010-08-15 来源:skyhackvip
Output Control 可以让你自由控制脚本中数据的输出,如:
当你想在数据已经输出后,再输出文件头的情况。输出控制函数不会作用于 header() 或 setcookie()所发送的文件头信息(标头)产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用,它会将这些输出缓存起来,而不是直接就输出到浏览器。
举例:
1 | ob_start(); |
2 | for ( $i =4; $i >0; $i --) { |
3 | echo $i . '<br />' ; |
4 | ob_flush(); |
5 | flush (); |
6 | sleep(1); |
7 | } |
以上程序将会在浏览器中每隔1秒依次显示从4 – 1的数字,若不使用缓冲区,结果将在脚本执行结束后一次性显示,而没有1秒的时间间隔。
相关函数列表:
- ob_start : 打开输出缓冲区,当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。
获取缓冲区信息
- ob_get_contents : 返回内部缓冲区的内容。
- ob_get_clean : 返回内部缓冲区的内容,并关闭缓冲区。相当于执行 ob_get_contents() and ob_end_clean()
- ob_get_flush :返回内部缓冲区的内容,并关闭缓冲区,再释放内部缓冲区的内容。相当于ob_end_flush() 并返回内部缓冲区内容
- —————
- ob_get_length :返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回FALSE。
- ob_get_level: Return the nesting level of the output buffering mechanism
- ob_get_status: Get status of output buffers
关闭/删除/刷新缓冲
- ob_clean :删除内部缓冲区的内容,但不关闭缓冲区,也就说该语句之后的输出内容将会继续被添加至缓冲区。
- ob_flush :释放内部缓冲区的内容,并删除内部缓冲区的内容,但不关闭缓冲区。
- flush: 将ob_flush释放出来的内容,以及不在PHP缓冲区中的内容,全部输出至浏览器。
- ————
- ob_end_clean :删除内部缓冲区的内容,并关闭缓冲区。
- ob_end_flush :释放内部缓冲区的内容,并关闭缓冲区。
其它
- ob_gzhandler: ob_start 回调函数,用gzip压缩缓冲区的内容。
- ob_implicit_flush: 打开或关闭绝对刷新,默认为关闭(但受implicit_flush选项的制约)。所谓绝对刷新,即当有输出语句(e.g. echo)被执行时,便把输出直接发送到浏览器,而不再需要调用 flush()或等到脚本结束时才输出。
- ob_list_handlers :List all output handlers in use
- output_add_rewrite_var: Add URL rewriter values
- output_reset_rewrite_vars — Reset URL rewriter values
这些函数的行为受php_ini设置的影响:
- output_buffering :该值为ON时,将在所有脚本中使用输出控制;若该值为一个数字,则代表缓冲区的最大字节限制,当缓存内容达到该上限时将会自动向浏览器输出当前的缓冲区里的内容。
- output_handler: 该选项可将脚本所有的输出,重定向到一个函数。例如,将 output_handler 设置为 mb_output_handler() 时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的处理输出缓冲。
- implicit_flush:作用同ob_implicit_flush,默认为Off。
注意事项:
- 一些Web服务器的output_buffering默认是4069字符或者更大,即输出内容必须达到4069字符服务器才会flush刷新输出缓冲,为 了确保flush有效,最好在ob_flush()函数前有以下语句:
print str_repeat(“ ”, 4096); //以确保到达output_buffering值。
- ob_* 系列函数是操作PHP本身的输出缓冲区,所以,ob_flush只刷新PHP自身的缓冲区。而flush是刷新apache的缓冲区。所以,正确使用俩者的顺序是:先ob_flush,然后flush。ob_flush是把数据从PHP的缓冲中释放出来,flush是把缓冲内/外的数据全部发送到浏览器。
- 不要误认为用了ob_start()后,脚本的echo/print等输出就永远不会显示在浏览器上了。因为PHP脚本运行结束后,会自动刷新缓冲区并输出内容。
- 要先ob_start()再 flash否则报错 Message: ob_flush() [ref.outcontrol]: failed to flush buffer. No buffer to flush.
相关阅读 更多 +