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

    上一篇返回首页 下一篇

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

    别人在看

    电脑屏幕不小心竖起来了?别慌,快捷键搞定

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    IT头条

    Synology 更新 ActiveProtect Manager 1.1 以增强企业网络弹性和合规性

    00:43

    新的 Rubrik Agent Cloud 加速了可信的企业 AI 代理部署

    00:34

    宇树科技 G1人形机器人,拉动一辆重达1.4吨的汽车

    00:21

    Cloudera 调查发现,96% 的企业已将 AI 集成到核心业务流程中,这表明 AI 已从竞争优势转变为强制性实践

    02:05

    投资者反对马斯克 1 万亿美元薪酬方案,要求重组特斯拉董事会

    01:18

    技术热点

    大型网站的 HTTPS 实践(三):基于协议和配置的优化

    ubuntu下右键菜单添加新建word、excel文档等快捷方式

    Sublime Text 简明教程

    用户定义SQL Server函数的描述

    怎么在windows 7开始菜单中添加下载选项?

    SQL Server 2016将有哪些功能改进?

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

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