0

0

PHP 输出缓冲控制(Output Control) 学习

php中文网

php中文网

发布时间:2016-06-13 09:18:50

|

1222人浏览过

|

来源于php中文网

原创

PHP 输出缓冲控制(Output Control) 学习

php 缓冲简介

      其实我对php ob 系列印象还是很模糊,具体怎么玩的,还不是很了解,平时curd,确实对这些内容没有深入。作为phper 甚是惭愧。网

 

上搜了一通,互相copy,代码运行不能出现作者所描述现象,本文良心出品,代码都是作者运行过。

 

   当执行输出的时候,比如 echo,print。输出并没有立即送给 web server, 而是将数据写入 php buffer。php output_buffering 机制

立即学习PHP免费学习笔记(深入)”;

 

好处当然提升性能。其实 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中的脏数据写回磁盘。

 

  举个例子

 

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

//南无阿弥陀佛

//Cannot modify header information - headers already sent by (output started at E:\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 标记的开头之前缓存内容,并且在接受到 

 

标记之前,不会显示出整个表格。

一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器

 

显示页面内容。

 比如:

 

/**

Server:LightTPD/1.4.28 (Win32)

X-Powered-By:PHP/5.3.27

*/

echo '佛法无边'."
";

ob_flush();

flush();

sleep(1);

LuckyCola工具库
LuckyCola工具库

LuckyCola工具库是您工作学习的智能助手,提供一系列AI驱动的工具,旨在为您的生活带来便利与高效。

下载

echo '法轮常转';

 

//output

 

上面的代码 在 chrome 浏览器上面 是一行一行的输出,在ie系列的浏览器则是全部输出。其实就是上面的 第四条一些浏览器只有当接收256

 

个字符才开始显示。把上面的代码改成下面形式:

 

 

/**

Server:LightTPD/1.4.28 (Win32)

X-Powered-By:PHP/5.3.27

*/

echo str_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();

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(),就会一行一行输出。 如果把ob_end_clean 换成 ob_end_flush  会把 before 输出来。

 

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

 

  总结

  php 脚本到浏览器,要经过  php buffer=》web server buffer=》browser buffer。 最后显示到浏览器。 缺一不可。 所以我们要 

 

ob_flush 和  flush 以及加上  echo str_pad('',4096) 才能调试出你想要的效果。

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

29

2025.12.25

错误代码dns_probe_possible
错误代码dns_probe_possible

本专题整合了电脑无法打开网页显示错误代码dns_probe_possible解决方法,阅读专题下面的文章了解更多处理方案。

20

2025.12.25

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

37

2025.12.25

word转换成ppt教程大全
word转换成ppt教程大全

本专题整合了word转换成ppt教程,阅读专题下面的文章了解更多详细操作。

6

2025.12.25

msvcp140.dll丢失相关教程
msvcp140.dll丢失相关教程

本专题整合了msvcp140.dll丢失相关解决方法,阅读专题下面的文章了解更多详细操作。

2

2025.12.25

笔记本电脑卡反应很慢处理方法汇总
笔记本电脑卡反应很慢处理方法汇总

本专题整合了笔记本电脑卡反应慢解决方法,阅读专题下面的文章了解更多详细内容。

6

2025.12.25

微信调黑色模式教程
微信调黑色模式教程

本专题整合了微信调黑色模式教程,阅读下面的文章了解更多详细内容。

5

2025.12.25

ps入门教程
ps入门教程

本专题整合了ps相关教程,阅读下面的文章了解更多详细内容。

4

2025.12.25

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

218

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 7.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号