`

php中ob_flush与flush的区别

    博客分类:
  • php
阅读更多
ob_flush/flush在php手册中的描述:都是刷新输出缓冲区, 并且还需要配套使用。
其实,它们的操作对象不同,有些情况下,flush根本不做什么事情。
ob_*系列函数, 是操作PHP本身的输出缓冲区。

所以, ob_flush是刷新PHP自身的缓冲区。而flush, 严格来讲, 这个只有在PHP做为apache的Module(handler或者filter)安装的时候, 才有实际作用. 它是刷新WebServer(可以认为特指apache)的缓冲区。

在apache module的sapi下, flush会通过调用sapi_module的flush成员函数指针, 间接的调用apache的api: ap_rflush刷新apache的输出缓冲区, 当然手册中也说了, 有一些apache的其他模块, 可能会改变这个动作的结果。

有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。

甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。
一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。

所以, 正确使用俩者的顺序是. 先ob_flush, 然后flush,如果Web服务器的操作系统是windows系统,那顺序颠倒或者不使用ob_flush()也不会出现问题。但是在Linux系统上就无法刷新输出缓冲。

当然, 在其他sapi下, 不调用flush也可以, 只不过为了保证你代码的可移植性, 建议配套使用。

根据以上描述,进行如下的测试:
测试1,
<?php
ob_start();
echo '1';
ob_flush();//输出php缓存并刷新
echo '2';
ob_flush();//输出php缓存并刷新
$cc = ob_get_contents();
ob_end_clean();
var_dump()($cc);
?>

输出:
12string(0) ""

测试2:
<?php
ob_start();
echo '1';
flush();     //输出apache缓存并刷新
echo '2';
flush();     //输出apache缓存并刷新
$cc = ob_get_contents();
ob_end_clean();
var_dump($cc);
//by www.jbxue.com
?>

输出:
string(2) "12"

测试3:
<?php
ob_start();
echo '1';
ob_flush();//输出php缓存并刷新
flush();//输出apache缓存并刷新
echo '2';
ob_flush();//输出php缓存并刷新
flush();//输出apache缓存并刷新
$cc = ob_get_contents();
ob_end_clean();
var_dump($cc);
//by www.jbxue.com
?>

输出:
12string(0) ""

测试4,
<?php
ob_start();
echo '1';
flush();//输出apache缓存并刷新
ob_flush();//输出php缓存并刷新
echo '2';
flush();//输出apache缓存并刷新
ob_flush();//输出php缓存并刷新
$cc = ob_get_contents();
ob_end_clean();
var_dump($cc);
?>

输出:
12string(0) ""
本文出处参考:http://www.jbxue.com/article/9469.html
分享到:
评论

相关推荐

    php中flush()、ob_flush()、ob_end_flush()的区别介绍

    在PHP编程中,`flush()`, `ob_flush()`, 和 `ob_end_flush()` 是三个用于处理输出缓冲(Output Buffering)的函数,它们之间有着不同的功能和用途。理解这三个函数的区别对于优化网页的动态内容输出至关重要,特别是...

    深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)

    在PHP编程中,`ob_flush()` 和 `flush()` 是两个重要的输出控制函数,它们主要用于处理输出缓冲区。本文将深入探讨这两个函数的区别以及如何正确使用它们。 首先,我们需要理解什么是输出缓冲区。在PHP中,当程序...

    php ob_flush,flush在ie中缓冲无效的解决方法

    `ob_flush()` 函数的作用是将PHP输出缓冲区中的内容发送到浏览器,而 `flush()` 则是尝试将缓冲区的内容立即发送到客户端,即使服务器端仍有数据未完全发送。然而,这两个函数并不总是能够确保在所有环境下都能正常...

    PHP逐行输出(ob_flush与flush的组合)

    当你调用`ob_flush()`时,它会把当前PHP缓冲区中的内容送到Web服务器的缓冲区,但并不立即发送到客户端。这意味着,即使`ob_flush`执行了,数据仍然可能在Web服务器中等待进一步处理。 而`flush`函数则更关注于Web...

    简单谈谈php中ob_flush和flush的区别

    `ob_flush` 和 `flush` 是两个常用于处理输出缓冲的函数,但它们的作用和使用场景有所不同。理解这两个函数的区别对于编写高效、可移植的PHP代码至关重要。 首先,`ob_flush` 属于 `ob_*` 系列函数,它主要负责处理...

    php中ob_flush函数和flush函数用法分析

    本文实例分析了php中ob_flush函数和flush函数用法。分享给大家供大家参考。具体如下: ob_flush()函数: 取出PHP buffering中的数据,放入server buffering flush()函数: 取出Server buffering的数据,放入browser ...

    PHP flush()与ob_flush()的区别详解

    在PHP编程中,`flush()`和`ob_flush()`都是用于处理输出缓冲的函数,但它们在功能和使用场景上存在一些关键的区别。本篇文章将详细阐述这两个函数的原理和它们在实际应用中的差异。 首先,了解缓冲的概念。缓冲...

    php使用ob_flush不能每隔一秒输出原理分析

    在描述中提到的示例代码中,开发者试图通过`ob_start()`开启缓冲,然后在循环中输出数字并调用`ob_flush()`和`flush()`来尝试即时发送到浏览器,但实际并未按预期每秒输出一次。这是因为`ob_flush()`和`flush()`仅能...

    用PHP的ob_start();控制您的浏览器cache!

    本文旨在探讨如何通过PHP中的`ob_start();`函数来控制浏览器缓存,这对于优化网站性能、减少网络流量以及改善用户体验等方面具有重要意义。 #### 详细知识点分析 ##### 一、Output Control 函数概览 Output ...

    PHP生成静态页面(ob_start+smarty)生成

    `ob_start()`是PHP中用于开启输出缓冲区的函数,它会将程序生成的所有输出存储在内存中,而不是立即发送到浏览器。这使得我们可以在程序执行完毕后再一次性处理这些内容,例如将它们写入文件或进行其他处理。 `ob...

    Nginx环境下PHP flush失效的解决方法

    在Nginx环境中,当你尝试使用PHP的`ob_flush`和`flush`函数进行逐行输出时,可能会遇到输出不实时的问题。这个问题通常与Nginx的内部缓冲机制有关。Nginx作为反向代理服务器,它会在接收到后端应用(如PHP-FPM)的...

    关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解

    与ob_end_flush()不同的是,ob_end_clean()不会输出缓冲区的内容,它完全清空缓冲区并释放内存。这在某些情况下特别有用,比如在数据传输或者页面重定向前需要清空所有输出缓冲区中的内容。 4. ob_get_clean()函数...

Global site tag (gtag.js) - Google Analytics