output_buffering如何在php中使用

介绍

output_buffering如何在php中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强>缓冲区
缓冲区是一个内存地址空间,Linux系统默认大小一般为4096 (4 kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的设备之间传办理数据的区域。通过缓冲区,可以使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每输入一个字符,操作系统并不会立即把这个字符直接写入到磁盘,而是先写入到缓冲区,当写满了一个缓冲的时候,才会把缓冲区中的数据写入磁盘,当然当调用内核函数冲()的时候,强制要求把缓冲区中的脏数据写回磁盘。

同样的道理,当执行呼应,打印的时候,输出并没有立即通过tcp传给客户端浏览器显示,而是将数据写入php buffer.php output_buffering机制,意味在tcp缓冲之前,建立了一新的队,列数据必须经过该队列。当一个php缓冲区写满的时候,脚本进程会将php缓冲区中的输出数据交给系统内核交由tcp传给浏览器显示,所以,数据会依次写到这几个地方:<>强回波/打印→php缓冲→tcp缓冲→浏览器

<强> php output_buffering
默认情况下,php缓冲区是开启的,而且该缓冲区默认值是4096,即4 kb。你可以通过在php . ini中配置文件中找到output_buffering配置。当回波、打印等输出用户数据的时候,输出数据都会写入到php output_buffering中,直到output_buffering写满,会将这些数据通过tcp传送给浏览器显示。你也可以通过ob_start()手动激活php output_buffering机制,使得即便输出超过了4 kb数据,也不真的把数据交给tcp传给浏览器,因为ob_start()将php缓冲空间设置到了足够大。只有直到脚本结束,或者调用ob_end_flush函数,才会把数据发送给客户端浏览器。

<强> 1。当output_buffering=4096,并且输出较少数据(少于一个缓冲区)

代码如下:


& lt; ?php
($ i=0;美元我& lt;10;美元我+ +){
echo $ i。& # 39;& lt; br/祝辞& # 39;;
睡眠(i + 1美元);,//
}
?在


现象:不是每隔几秒就会有间断性输出,而是直到响应结束,才能看一次性看到输出,在等待服务器脚本处理结束之前,浏览器界面一直保持空白。这是因为,数据量太小,php output_buffering没有写满。写数据的顺序,依次是回声→php缓冲→tcp缓冲→浏览器

<强> 2。当output_buffering=0,并且输出较少数据(少于一个缓冲区)

代码如下:


& lt; ? php
//通过报错(& # 39;output_buffering # 39;, 0)并不生效
//应该编辑/etc/php。ini,设置output_buffering=0禁用输出缓冲机制
//报错(& # 39;output_buffering # 39;, 0),,//彻底禁用输出缓冲功能
($ i=0;美元我& lt;10;美元我+ +){
echo $ i。& # 39;& lt; br/祝辞& # 39;;
冲洗();//通知操作系统底层,尽快把数据给客户端浏览器
睡眠(i + 1美元);,//
}
?在


现象:与刚才显示并不一致,禁用了php缓冲机制之后,在浏览器可以断断续续看到间断性输出,不必等到脚本执行完毕才看到输出。这是因为,数据没有在php output_buffering中停留。写数据的顺序依次是回声→tcp缓冲→浏览器

<强> 3。当output_buffering=4096,输出数据大于一个缓冲区,不调用ob_start ()

代码如下:


#//创建一个4 kb大小的文件
美元dd if=/dev/0=f4096 b=4096数=1
& lt; ?php
($ i=0;美元我& lt;10;$我+ +){
回声file_get_contents (& # 39;。/f4096& # 39;)。我美元。& # 39;& lt; br/祝辞& # 39;;
睡眠(i + 1美元);
}
?在


现象:响应还没结束(http连接没有关闭),断断续续可以看到间断性输出,浏览器界面不会一直保持空白。尽管启用了php output_buffering机制,但依然会间断性输出,而不是一次性输出,是因为output_buffering空间不够用。每写满一个php缓冲,数据就会发送到客户端浏览器。

<强> 4。当output_buffering=4096,输出数据大于一个tcp缓冲区,调用ob_start ()

代码如下:


& lt; ? php
ob_start();,//开启php缓冲
($ i=0;美元我& lt;10;$我+ +){
回声file_get_contents (& # 39;。/f4096& # 39;)。我美元。& # 39;& lt; br/祝辞& # 39;;
睡眠(i + 1美元);
}
ob_end_flush ();
?在


现象:直到服务端脚本处理完成,响应结束,才看到完整输,输出间隔时间很短,以至你感受不到停顿。在输出之前,浏览器一直保持着空白界面,等待服务端数据。这是因为,php一旦调用了ob_start()函数,它会将php缓冲扩展到足够大,直到ob_end_flush函数调用或者脚本运行结速才发送php缓冲区中的数据到客户端浏览器。

output_buffering如何在php中使用