如上图,是一个大略单纯的缓冲区仿照图,左端入口的数据具有单个输入体积小,速率快,数量多,但右端输出数据具有体历年夜,速率慢的特点。如果没有缓冲区,很随意马虎造成数据堵塞,有了缓冲区之后,当数据填满缓冲区,再统一输出,则可以大大减少系统包袱。
PHP在实行的过程中,嵌入的HTML代码,’echo’,’print_r’等指令都是一次数据输出,正是由于有缓冲区的存在,系统可以在php实行完之后再一次把数据发送给浏览器,运行如下代码:
<?phpecho \公众这里是第一行数据\"大众;echo \公众这里是第二行数据,下面就寝5秒\公众;sleep(5);echo \"大众这里是第三行数据,下面是HTML代码\公众;?><h1>标题</h1>
创造浏览器是同时显示所有内容,而不是先显示第一行和第二行数据,等待5秒后再显示后面的数据。不仅这样,PHP的缓冲区还供应给我们更加强大的功能,我们可以在数据发送之前对其作出捕获,变动等。PHP供应给我们”ob_”系列函数,例如如下代码,可以对某些字符进行更换:
<?phpob_start();echo \"大众Hello world, this is http://www.hitoy.org/\"大众;$content = ob_get_contents();ob_end_clean();echo str_replace(\公众http://\公众,\"大众https://\"大众,$content);?>
上面中的ob_start,ob_get_contents,ob_end_clean分别用来开启用户缓冲区,获取缓存内容和关闭缓存区,PHP中所有的输出掌握函数有1:
flush — 刷新输出系统缓冲
ob_clean — 清空(擦掉)输出缓冲区
ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲
ob_flush — 冲刷出(送出)输出缓冲区中的内容
ob_get_clean — 得到当前缓冲区的内容并删除当前输出缓。
ob_get_contents — 返回输出缓冲区的内容
ob_get_flush — 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
ob_get_length — 返回输出缓冲区内容的长度
ob_get_level — 返回输出缓冲机制的嵌套级别
ob_get_status — 得到所有输出缓冲区的状态
ob_gzhandler — 在ob_start中利用的用来压缩输出缓冲区中内容的回调函数。ob_start callback function to gzip output buffer
ob_implicit_flush — 打开/关闭绝对刷送
ob_list_handlers — 列出所有利用中的输出处理程序。
ob_start — 打开输出掌握缓冲
output_add_rewrite_var — 添加URL重写器的值(Add URL rewriter values)
output_reset_rewrite_vars — 重设URL重写器的值(Reset URL rewriter values)
php中,可以通过php.ini的output_buffering来设置缓存,On表示无穷大,Off表示关闭,数字则表示缓冲区的大小(以字节为单位),默认大小是4KB,如果设置成off,则示例一的代码是不是就可以分段在浏览器显示了呢?答案是否定的,有两点须要把稳,第一点纵然把PHP的缓存关闭,php输出在系统层面也有缓存(可以理解为Linux系统stdout的缓存),必须通过flush函数输出;第二点是一些有些浏览器对一次吸收的笔墨长度有限定,如果太少,则不予显示。以是这样的代码可以分段显示:
<?phpecho \"大众这里是第一行数据\公众;echo str_repeat(\公众 \"大众,1024);echo \"大众这里是第二行数据,下面就寝5秒\"大众;flush();sleep(5);echo \"大众这里是第三行数据,下面是HTML代码\"大众;?><h1>标题</h1>
当然在实际生产环境,直接把output_buffering关闭的情形比较少见,我们可以通过ob_系列函数来进行操作,下面的例子是利用缓冲进行做事器推送(comet)的示例。如下代码可以给客户端进行信息推送:
<?phpob_start();$i=0;while($i<100){ echo $i.str_repeat(\公众 \公众,2024); $i++; ob_flush(); flush(); sleep(5);}?>