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

    上一篇返回首页 下一篇

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

    别人在看

    Edge浏览器百度被劫持/篡改怎么办,地址后边跟着尾巴#tn=68018901_7_oem_dg

    Google Chrome 在 iPhone 上新增了 Safari 数据导入选项

    Windows 11专业版 KMS工具激活产品密钥的方法

    DEDECMS安全策略官方出品

    Microsoft Text Input Application 可以关闭吗?

    新版本QQ如何关闭自带的浏览器?

    C++编程语言中continue的用法和功能,附举例示范代码

    c++ map 的数据结构、基本操作以及其在实际应用中的使用。

    C语言如何避免内存泄漏、缓冲区溢出、空指针解引用等常见的安全问题

    C语言中的break语句详解

    IT头条

    马斯克2026最新采访总结:2040年,全球机器人数量将突破100亿台

    23:52

    专家解读|规范人工智能前沿业态健康发展的新探索:解读《人工智能拟人化互动服务管理暂行办法》

    00:54

    用至强 6高存力搞定MoE卸载!

    17:53

    美国将允许英伟达向中国“经批准的客户”出售H200 GPU

    02:08

    苹果与微信就15%手续费达成一致?腾讯未置可否

    22:00

    技术热点

    PHP 和 Node.js 的10项对比挑战

    Javascript闭包深入解析及实现方法

    windows 7、windows 8.1手动增加右键菜单功能技巧

    MYSQL出错代码大汇总

    windows 7假死机怎么办 windows 7系统假死机的原因以及解决方法

    Ubuntu(Linux)下配置IP地址的方法

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

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