关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » PHP »PHP输出缓冲控制(Output Control)总结

    PHP输出缓冲控制(Output Control)总结

    2014-12-15 00:00:00 出处:oschina
    分享

    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中的脏数据写回磁盘。

    举个例子

    < 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:phptest.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 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。 一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。

    比如:

    < 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系列的浏览器则是全部输出。其实就是上面的 第四条一些浏览器只有当接收256个字符才开始显示。把上面的代码改成下面形式:

    < 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下面就会一行一行输出,因为超过256个字符。

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

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

    总结

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

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    商业智能成CIO优先关注点 技术落地方显成效(1)

    用linux安装MySQL时产生问题破解

    JAVA中关于Map的九大问题

    windows 7旗舰版无法使用远程登录如何开启telnet服务

    Android View 事件分发机制详解

    MySQL用户变量的用法

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。