所以问题应该出在了环境配置上而不是使用方法上,php buffer 是开启的

总结

php 脚本到浏览器,要透过  php buffer=》web server buffer=》browser
buffer。 最终彰显到浏览器。 必不可少。 所以我们要 ob_flush 和 
flush 甚至丰富  echo str_pad(”,4096卡塔尔(قطر‎ 能力调解出您想要的机能。

php output_buffering私下认可意况下,php
buffer是开启的,何况该buffer暗中同意值是4096,即4kb。你能够经过在php.ini配置文件中找到output_buffering配置.当echo,print等出口顾客数据的时候,输出数据都会写入到php
output_buffering中,直到output_buffering写满,会将这么些数据通过tcp传送给浏览器展现。你也能够因此ob_start(卡塔尔手动激活php
output_buffering机制,使得就算输出超越了4kb数据,也不真的把多少交由tcp传给浏览器,因为ob_start(卡塔尔将php
buffer空间设置到了丰盛大。唯有直到脚本甘休,或许调用ob_end_flush函数,才会把多少发送给顾客端浏览器。

只是你也要必须确认保证关闭缓存的操作和开启缓存的操作数量同样多。
ob_start(State of Qatar能够钦点三个回调函数来管理缓存数据,借使一个ob_start(卡塔尔(قطر‎内部嵌套了另一个ob_start(State of Qatar,大家只要,外层的ob_start(),编号是A,内层的ob_start(卡塔尔(قطر‎编号是B,它们分别制订了一个回调函数分别是functionA和functionB,那么在缓存B中的数据输出时,它会先辈funcitonB回调函数管理,再提交外层的functionA回调函数处理,之后手艺出口到顾客端。

ob 别的函数表明

1.ob_end_flush 与 ob_end_clean**

end
的以文害辞就得了,关闭缓冲区,都是停业输出缓冲,三个是出口缓冲区,三个是清除。譬喻

<?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);
}

上述代码是一差二错出口全体内容,并不是二个三个出口。ob_end_clean(卡塔尔国不是关闭了缓冲了?怎么不是叁个一个出口呢,其实大家地点也说了,php
不是向来出口给浏览器,而是 web server。 纵然php 未有了 缓冲。可是web
server 依然有个别。所以下边代码:

/**
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);
}

足够flush(State of Qatar,就能够一行一行输出。 假诺把ob_end_clean 换成 ob_end_flush 
会把 before 输出来。

其余函数 可参照他事他说加以考察手册,比较轻松。

1.ob_start激活output_buffering机制。一旦激活,脚本输出不再直接出给浏览器,而是先一时写入php
buffer内部存款和储蓄器区域。php暗中认可开启output_buffering机制,只不过,通过调用ob_start()函数据output_buffering值扩充到丰硕大。也能够内定$chunk_size来指定output_buffering的值。$chunk_size暗中认可值是0,表示停止脚本运维甘休,php
buffer中的数据才会发送到浏览器。假若您设置了$chunk_size的大大小小,则象征一旦buffer中多少长度到达了该值,就能将buffer中的数据发送给浏览器。当然,你能够透过点名$ouput_callback,来拍卖buffer中的数据。举个例子函数ob_gzhandler,将buffer中的数据压缩后再传递给浏览器。2.ob_get_contents获取一份php
buffer中的数据拷贝。值得注意的是,你应该在ob_end_clean(卡塔尔函数调用在此之前调用该函数,否则ob_get_contents(State of Qatar再次来到二个空字符中。3.ob_end_flush与ob_end_clean那一个函数有一点相仿,都会关闭ouptu_buffering机制。但不相同的是,ob_end_flush只是把php
buffer中的数据冲到顾客端浏览器,而ob_clean_clean将php
bufeer中的数据清空,但不发送给顾客端浏览器。ob_end_flush调用之后,php
buffer中的数据还是留存,ob_get_contents(卡塔尔国依然能够得到php
buffer中的数据拷贝。而ob_end_clean(卡塔尔调用之后ob_get_contents(卡塔尔国取到的是空字符串,同不日常间浏览器也收到不到输出,即未有其余输出。惯用案例时常在有的模板引擎和页面文件缓存中看出ob_start(卡塔尔使用。上边湿CI中加载模板的程序代码:复制代码 代码如下:/* * Buffer the output * * We buffer
the output for two reasons: * 1. Speed. You get a significant speed
boost. * 2. So that the final rendered template can be *
post-processed by the output class. Why do we * need post processing?
For one thing, in order to * show the elapsed page load time. Unless we
* can intercept the content right before it’s sent to * the browser
and then stop the timer it won’t be accurate. */ob_start();// If the
PHP installation does not support short tags we’ll// do a little string
replacement, changing the short tags// to standard PHP echo
statements.if @ini_get === FALSE AND config_item == TRUE卡塔尔国{
//替换短标志=***>echo
eval(‘?>’.preg_replace(“/;*\s*\?>/”, “; ?>”,
str_replace(‘=’, ‘ $this->_ci_ob_level +
1){ob_end_flush(State of Qatar;}else{
//将模板内容加多到输出流中$_ci_CI->output->append_output;
//清除buffer@ob_end_clean();}

buffer —- flush()
 
buffer是多个内部存储器地址空间,Linux系统私下认可大小相近为4096(1kb卡塔尔国,即多个内部存款和储蓄器页。主要用以存款和储蓄速度区别台的道具或然优先级不等的
设备之间传办理数据的区域。通过buffer,能够使进度那间的互相等待减少。这里说三个最早一点的例子,你张开文本编辑器编辑一个文件的时候,你每输入
三个字符,操作系统并不会立时把那么些字符一贯写入到磁盘,而是先写入到buffer,当写满了二个buffer的时候,才会把buffer中的数据写入磁
盘,当然当调用内核函数flush(卡塔尔国的时候,强制须要把buffer中的脏数据写回磁盘。
一点差距也未有于的道理,当推行echo,print的时候,输出并未当即通过tcp传给客户端浏览器呈现,
而是将数据写入php buffer。php output_buffering机制,意味在tcp
buffer以前,创设了一新的类别,数据必须通过该队列。当贰个php
buffer写满的时候,脚本进程会将php
buffer中的输出数据交由系统内核交由tcp传给浏览器呈现。所以,数据会依次写到那多少个地点echo/pring
-> php buffer -> tcp buffer -> browser

举个例证

<?php
echo "南无阿弥陀佛<br>";
header("content-type:text/html;charset='utf-8'");
echo "真善忍好!";
//output
//南无阿弥陀佛
//真善忍好

header()必须要在任何实际出口以前调用,可是大家前后相继已经出口了,却健康运营。在看上面的代码:

<?php

echo "南无阿弥陀佛<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)
//真善忍好

地点程序表明程序并从未马上输出,而当调用ob_flush
函数的时候才刷新缓冲,输出。

4.当output_buffering=4096, 输出数据超越三个tcp buffer,
调用ob_start()
复制代码 代码如下:output
buffering函数

那三个函数的行使怕是成都百货上千人最吸引的三个问题,手册上对四个函数的解释也隐隐,没有显著的提议它们的分歧,就像二者的功用都以刷新输出缓存。但在大家随笔一同初的代码中只要讲fush(State of Qatar替换来ob_flush(卡塔尔,程序就再无法准确奉行了。显明,它们是有分其余,不然也手册中平昔表明在那之中七个是其余多少个函数的别称就能够了,没必要分别证实。那么它们的区分到底是什么呢?

ob_flush() 与 flush()

ob_flush() , flush() 函数php
手册上皆有详尽的求证,你能够去查看一下。二者的区分是:

ob_flush(卡塔尔 是刷新PHP自己的缓冲区

flush(卡塔尔(قطر‎是 它是刷新WebServer
服务器的缓冲。输出到浏览器。可是会合世下边包车型地铁意况:

  1. 各自web服务器程序,特别是Win32下的web服务器程序,在出殡和安葬结果到浏览器从前,仍旧会缓存脚本的输出,直到程序截至结束。
  2. 有些Apache的模块,比如mod_gzip,恐怕自身进行输出缓存,那将导致flush()函数产生的结果不会登时被发送到顾客端浏览器。
  3. 居然浏览器也会在呈现在此以前,缓存接受到的内容。比如 Netscape
    浏览器会在经受到换行或 html 标志的初阶在此之前缓存内容,何况在选取到
    </table> 标志在此之前,不会来得出全数表格。
  4. 部分本子的 Microsoft Internet Explorer
    独有当接受到的2六十二个字节以往才初步显得该页面,所以必需发送一些格外的空格来让这么些浏览器显示页面内容。

比如:

<?php
/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo '佛法无边'."<BR>";
ob_flush();
flush();
sleep(1);
echo '法轮常转';

//output

上边的代码 在 chrome 浏览器上边是单排一行的出口,在ie种类的浏览器则是整个输出。其实正是地点的
第四条一些浏览器独有当选取2六19个字符才起始显得。把地点的代码改成上边情势:

<?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

如此那般在ie下边就能一行一行输出,因为超越259个字符。

无差距于的道理,当实践echo,print的时候,输出并未当即通过tcp传给顾客端浏览器展现,
而是将数据写入php buffer。php output_buffering机制,意味在tcp
buffer在此之前,创立了一新的类别,数据必得通过该队列。当叁个php
buffer写满的时候,脚本进度会将php
buffer中的输出数据交由系统内核交由tcp传给浏览器突显。所以,数据会依次写到这多少个地方:echo/print
-> php buffer -> tcp buffer -> browser

而ob_end_flush(卡塔尔国调用之后
ob_get_contents(卡塔尔国取到的是空字符串,同不时间浏览器也接到不到输出,即未有此外输出。

php 缓冲简要介绍

骨子里本身对php ob
连串影象还是很模糊,具体怎么玩的,还不是很精晓,日常curd,确实对这一个内容还未有浓重。作为phper
甚是惭愧。网络搜了一通,相互copy,代码运营无法现身作者所陈诉场景,本文良心出品,代码都以笔者运维过。

当推行输出的时候,举例 echo,print。输出并不曾马上送给 web server,
而是将数据写入 php buffer。php output_buffering
机制好处当然提高质量。其实 php 文件最终在浏览器上展现,走过3个缓冲阶段:
php buffer=》web server buffer=》browser buffer。 最终展现到浏览器

私下认可意况下,php buffer 是翻开的,何况该 buffer 暗许值是4096,即4
kb。你能够通过在php.ini配置文件中找到output_buffering配置。buffer是二个内部存储器地址空间,Linux系统默许大小相符为4096(4kb卡塔尔国,即一个内部存款和储蓄器页。首要用来存款和储蓄速度不联合的配备也许优先级不等的器材之间传办理数据的区域。通过buffer,能够使进程那间的并行等待减少。这里说三个最先一点的事例,你张开文件编辑器编纂一个文件的时候,你每输入叁个字符,操作系统并不会及时把那些字符向来写入到磁盘,而是先写入到buffer,当写满了三个buffer的时候,才会把buffer中的数据写入磁盘,当然当调用内核函数flush(卡塔尔国的时候,强逼必要把buffer中的脏数据写回磁盘。

1.ob_get_level**回来输出缓冲机制的嵌套等级,能够幸免模板重复嵌套本身。

除此以外,手册说,对于有个别web服务器,举个例子apache,在动用回调函数有非常大可能会改变程序当前的专业目录,祛除办法是在回调函数中活入手动把职业目录改进回来,用chdir函数,这一点就像是有的时候蒙受,蒙受的时候记得去查手册吧。

2.当output_buffering=0,并且输出超级少多少复制代码 代码如下:

在未有张开缓存时,脚本输出的剧情都在劳务器端处于等候输出的情形,flush(State of Qatar可以将等待输出的剧情立时发送到客商端。

1.当output_buffering=4096,何况输出比较少多少复制代码 代码如下:

proxy_buffering off;
gzip off;
fastcgi_keep_conn on;

bufferbuffer是多个内部存款和储蓄器地址空间,Linux系统暗中认可大小肖似为4096,即二个内部存款和储蓄器页。首要用以存款和储蓄速度分化台的装置或然优先级不等的配备之间传办理数据的区域。通过buffer,能够使进度那间的相互等待降少。这里说叁个领头一点的例子,你展开文本编辑器编辑三个文件的时候,你每输入二个字符,操作系统并不会应声把那一个字符平昔写入到磁盘,而是先写入到buffer,当写满了二个buffer的时候,才会把buffer中的数据写入磁盘,当然当调用内核函数flush(卡塔尔(قطر‎的时候,强迫要求把buffer中的脏数据写回磁盘。

ob_end_flush调用以前 ,php
buffer中的数据还是留存,ob_get_contents(State of Qatar依然能够收获php
buffer中的数据拷贝。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章