`
xiaoqiang6775
  • 浏览: 32256 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

php ob_start输出缓冲区是可堆叠性探究

 
阅读更多

关于 ob_start 的作用在此不做过多描述,网上很多。

请看下面的小程序 ( 在看之前,说明一下,在 php.ini 中设置 output_buffering=on)

<?php
ob_start();
echo str_repeat(' ', 1000);    //Chrome和FF缓存1000Bytes,这里用来先将浏览器缓存用掉,但是很疑惑这一行输出为什么没有被output_buffering存起来,而是直接输出了
for ($i = 0; $i < 5; $i++) {
    echo $i . '<br />';
    ob_flush();
    flush();
    sleep(1);
}
?>

 

如果对 ob_start 很熟悉的话,应该会判断出结果:直接输出了 0 1 2 3 4 ;有人很奇怪为什么会出现这个情况,而不是 sleep 1s 后输出一个。这个暂不解释,在看一下下面这个程序:

<?php
ob_start();
echo str_repeat(' ', 1000);    //Chrome和FF缓存1000Bytes,这里用来先将浏览器缓存用掉,但是很疑惑这一行输出为什么没有被output_buffering存起来,而是直接输出了
for ($i = 0; $i < 5; $i++) {
    echo $i . '<br />';
    ob_flush();
    flush();
    sleep(1);
}
ob_end_flush();
for ($i = 0; $i < 5; $i++) {
    echo $i . '<br />';
    ob_flush();
    flush();
    sleep(1);
}
?>
 

 

结果是先输出了 0 1 2 3 4 然后每 sleep 1s 输出一个数字。

因为, ob_start 函数是有堆叠性的,也就是说, ob_start 一般要和 ob_end_flush 配合使用。

先说一下第一个程序,在 php 配置文件内已经开启了 output_buffering 暂且编号 1 ,在程序中又因为 ob_start 的原因开启了另一缓冲区暂且编号 2 (请明白是缓冲区 buffering ,而不是 cache ),因为 ob_flush 是刷新 php 缓冲区,而不是关闭,所以,每 sleep 1s 只是刷新了缓冲区 2 ,所以会等待输出结束或者超过 buffering 的值时才会输出。而第 2 个程序因为关闭了一个 cache 所以先输出了 0 1 2 3 4 然后每 sleep 1s 输出一个数字。

这个算是迎接 2013 的第一篇博客,以后会多多经营,请码友们多指教。

分享到:
评论

相关推荐

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

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

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

    必须使用`ob_end_flush()`或`flush()`等函数显式输出缓冲区内容。 3. **ob_get_contents** - **函数格式**:`ob_get_contents();` - **说明**:获取当前输出缓冲区的内容。如果输出缓冲未开启,则返回`FALSE`。 ...

    ob_start(),ob_start(ob_gzhandler)使用

    在使用ob_start()或者ob_start('ob_gzhandler')进行输出控制时,也要注意避免过多的嵌套或者错误地使用这些函数,这可能会导致不可预料的错误和性能问题。正确的使用方法是在输出之前调用ob_start(),在所有输出完成...

    PHP用法ob_start生成html页面的方法_.docx

    在这个例子中,`ob_start()`开启缓冲,然后输出的内容会被保存,直到`ob_end_flush()`被调用,这时才将缓冲区的内容发送到浏览器。在这两者之间,可以设置HTTP头信息,例如`header()`函数,它必须在任何输出之前调用...

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

    例如,在生成图片并下载的情况下,可以使用ob_start()开始缓冲输出,然后将图片数据写入输出缓冲区,使用ob_get_contents()获取缓冲区的内容,然后可以进行进一步操作,比如删除临时文件或发送到客户端。在客户端,...

    php中 ob_start等函数截取标准输出的方法

    我想将PHP脚本中输出的东西收集在一起,于是使用了ob_start和ob_end_flush这两个函数,确实有达到收集输出内容的作用,但同时也将这些打印到了控制台界面中。我想问的是有没有办法,阻止PHP像控制台输出信息。该软件...

    php基于ob_start(ob_gzhandler)实现网页压缩功能的方法

    `ob_start()` 是PHP的输出控制函数,它开启了一个输出缓冲区,允许脚本在实际发送到浏览器之前处理输出。当`ob_start()`被调用时,PHP会开始在内存中存储所有输出的内容,直到`ob_end_flush()` 或其他 `ob_end_XXX()...

    php利用ob_start()清除输出和选择性输出的方法

    在PHP编程中,`ob_start()` 是一个非常实用的内置函数,它用于启动输出缓冲。输出缓冲允许程序临时存储输出,而不是直接发送到浏览器。它通常用于处理HTML代码,例如,可以在输出前对其进行修改或清洗,以及用于页面...

    PHP中ob_start函数的使用说明

    这是因为`ob_start`会将所有输出的数据暂存起来,直到你显式地调用`ob_end_flush()`或`flush()`来发送缓冲区的内容到浏览器。 下面我们将详细讨论`ob_start`函数以及与之相关的其他输出控制函数: 1. **`ob_start`...

    php使用ob_start()实现图片存入变量的方法

    `ob_start()`函数在这种场景下就显得尤为重要,它可以帮助我们将输出缓冲区开启,以便于捕获图片的二进制数据。下面将详细阐述如何使用`ob_start()`配合其他函数来实现这个功能。 `ob_start()`是PHP的输出控制函数...

    解析PHP中ob_start()函数的用法

    `ob_start()`可以在`header()`之前调用,确保所有的输出都进入缓冲区,从而避免该错误。例如: ```php ob_start(); // 开启缓冲区 echo "Hello\n"; // 输出会被暂存 header("Location: index.php"); // 重定向到...

    php缓冲 output_buffering和ob_start使用介绍

    当调用ob_start()时,PHP会开始将输出保存到缓冲区,直到脚本执行完毕或者调用ob_end_flush()后才发送到客户端。ob_start()还可以配合ob_get_contents()使用,将输出保存到变量中,这在需要对输出内容进行处理或修改...

    PHP缓存技术详解 ob_start

    有些信息比方经常不变的,但是还是能变的信息放在缓存中以加快显示速度,这是很有价值的,所谓的缓存,通俗的理解就是一些保存在服务器端的共用信 息.它是于服务器同生死的,我们在保存缓存的时候可以指定下次更新的时间...

    用php的ob_start来生成静态页面的方法分析

    `ob_start()` 函数开启输出缓冲区,这意味着在PHP脚本运行过程中产生的任何输出(例如HTML、CSS或JavaScript)都不会立即发送到浏览器,而是被存储在内存中的缓冲区。这使得我们有机会在所有输出完成后再一次性处理...

    用PHP ob_start()控制浏览器cache、生成html实现代码

    在PHP编程中,`ob_start()`函数是一个非常重要的功能,它用于开启输出缓冲区,允许开发者在发送数据到浏览器之前对其进行处理。这在处理页面重定向、设置HTTP头信息(如`header()`函数)以及生成HTML静态文件时尤为...

    PHP使用ob_start生成html页面的方法

    通过使用ob_start函数,开发者可以暂时性地将脚本的输出存储到一个内部缓冲区中,而不是直接发送到浏览器。这一功能在生成HTML页面时尤为有用。 首先,ob_start函数本身并不复杂。它主要用于打开输出缓冲区,并可选...

Global site tag (gtag.js) - Google Analytics