温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

PHP中怎么实现输出缓冲控制

发布时间:2021-07-24 17:44:28 来源:亿速云 阅读:133 作者:Leah 栏目:编程语言

PHP中怎么实现输出缓冲控制,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

  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)才能调试出你想要的效果。

关于PHP中怎么实现输出缓冲控制问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI