PHP中怎么实现输出缓冲控制
创始人
2024-12-19 05:46:49
0次

  PHP输出缓冲控制是什么

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

  PHP输出缓冲控制代码怎么写

  echo"南无阿弥陀佛
";

  header("content-type:text/html;charset='utf-8'");

  echo"真善忍好!";

  //output

  //南无阿弥陀佛

  //真善忍好

  header()必须在任何实际输出之前调用,但是我们程序已经输出了,却正常运行。在看下面的代码:

  echo"南无阿弥陀佛
";

  ob_flush();

  header("content-type:text/html;charset='utf-8'");

  echo"真善忍好!";

  //output

  //南无阿弥陀佛

  //Cannotmodifyheaderinformation-headersalreadysentby(outputstartedatE:\php\test.php:3)

  //真善忍好

  上面程序说明程序并没有立即输出,而当调用ob_flush函数的时候才刷新缓冲,输出。

  ob_flush()与flush()

  ob_flush(),flush()函数php手册上都有详细的说明,你可以去查阅一下。二者的区别是:

  ob_flush()是刷新PHP自身的缓冲区

  flush()是它是刷新WebServer服务器的缓冲。输出到浏览器。但是会出现下面的情况:

  个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。甚至浏览器也会在显示之前,缓存接收到的内容。例如Netscape浏览器会在接受到换行或html标记的开头之前缓存内容,并且在接受到标记之前,不会显示出整个表格。一些版本的MicrosoftInternetExplorer只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。

  比如:

  /**

  Server:LightTPD/1.4.28(Win32)

  X-Powered-By:PHP/5.3.27

  */

  echo'佛法无边'."
";

  ob_flush();

  flush();

  sleep(1);

  echo'法轮常转';

  //output

  上面的代码在chrome浏览器上面是一行一行的输出,在ie系列的浏览器则是全部输出。其实就是上面的第四条一些浏览器只有当接收256个字符才开始显示。把上面的代码改成下面形式:

  /**

  Server:LightTPD/1.4.28(Win32)

  X-Powered-By:PHP/5.3.27

  */

  echostr_pad('',240)."\n";

  echo'佛法无边'."
";

  ob_flush();

  flush();

  sleep(1);

  echo'法轮常转';

  //output

  这样在ie下面就会一行一行输出,因为超过256个字符。

  ob其他函数说明

  1.ob_end_flush与ob_end_clean

  end的顾名思义就结束,关闭缓冲区,都是关闭输出缓冲,一个是输出缓冲区,一个是清除。比如

  /**

  Server:LightTPD/1.4.28(Win32)

  X-Powered-By:PHP/5.3.27

  */

  echo'before';

  ob_end_clean();

  echostr_pad('',4096)."\n";

  for($i=10;$i>0;$i--)

  {

  echo$i;

  sleep(1);

  }

  上述代码是一下输出全部内容,而不是一个一个输出。ob_end_clean()不是关闭了缓冲了?怎么不是一个一个输出呢,其实我们上面也说了,php不是直接输出给浏览器,而是webserver。虽然php没有了缓冲。但是webserver还是有的。所以下面代码:

  /**

  Server:LightTPD/1.4.28(Win32)

  X-Powered-By:PHP/5.3.27

  */

  echo'before';

  ob_end_clean();

  echostr_pad('',4096)."\n";

  for($i=10;$i>0;$i--)

  {

  flush();

  echo$i;

  sleep(1);

  }

  加上flush(),就会一行一行输出。假如把ob_end_clean换成ob_end_flush会把before输出来。

  其他函数可参考手册,比较简单。

  总结

  php脚本到浏览器,要经过phpbuffer=》webserverbuffer=》browserbuffer。最后显示到浏览器。缺一不可。所以大家要ob_flush和flush以及加上echostr_pad(”,4096)才能调试出你想要的效果。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...