php中的输出控制

缓冲输出

<?php
for ($i=10; $i>0; $i--)
{
 echo $i;
 flush();
 sleep(1);
}
?>按照php手册里的说法

该函数将当前为止程序的所有输出发送到用户的浏览器。

上面的这段代码,应该隔一秒钟输出一次$i。但是实际中却不一定是这样。有可能是等了10秒钟后,所有的输出同时呈现出来。

好,我们来改一下这段代码,改成

<?php
ob_end_clean();//修改部分
for ($i=10; $i>0; $i--)
{
 echo $i;
 flush();
 sleep(1);
}
?>嘿,加了这一句ob_end_clean();,居然就OK了。实际上,我们把ob_end_clean()换成ob_end_flush()也一样OK。

我再来改一改。

<?php
for ($i=10; $i>0; $i--)
{
 echo $i;
 ob_flush();//修改部分
 flush();
 sleep(1);
}
?>运行一下,是不是发现$i也隔一秒输出一次了?这是为什么呢?
别急,我们来看看php.ini。

打开php.ini,搜索output_buffering,我们会看到类似这样的设置 output_buffering = 4096。正如它的名字output_buffering一样,这个设置的作用就是把输出缓冲一下,缓冲大小为4096bytes.

在我们的第一段代码里,之所以没有按预期的输出,正是因为这个output_buffering把那些输出都缓冲了。没达到4096bytes或者脚本结束,输出是不会被发送出去的。

而第二段代码中的ob_end_clean()和ob_end_flush()的作用,就是终止缓冲。这样就不用等到有4096bytes的缓冲之后才被发送出去了。

第三段代码中,用了一句ob_flush(),它的作用就是把缓冲的数据发送出去,但是并不会终止缓冲,所以它必须在每次flush()前使用。

如果不想使用ob_end_clean(),ob_end_flush()和ob_flush(),我们就必须把php.ini里的output_buffering设得足够小,例如设为0。需要注意的是,如果你打算在脚本中使用ini_set(”output_buffering”,”0″)来设置,那么请停下来吧,这种方法是不行的。因为在脚本一开始的时候,缓冲设置就已经被载入,然后缓冲就开始了。

可能你会问了,既然ob_flush()是把缓冲的数据发送出去,那么为什么还需要用flush()???直接用下面这段代码不行吗??

<?php
for ($i=10; $i>0; $i--)
{
 echo $i;
 ob_flush();
 sleep(1);
}
?>请注意ob_flush()和flush()的区别。前者是把数据从PHP的缓冲中释放出来,后者是把不在缓冲中的或者说是被释放出来的数据发送到浏览器。所以当缓冲存在的时候,我们必须ob_flush()和flush()同时使用。

那是不是flush()在这里就是不可缺少的呢?不是的,我们还有另外一种方法,使得当有数据输出的时候,马上被发送到浏览器。下面这两段代码就是不需要使用flush()了。(当你把output_buffering设为0的时候,连ob_flush()和ob_end_clean()都不需要了)

<?php
ob_implicit_flush(true);
for ($i=10; $i>0; $i--)
{
 echo $i;
 ob_flush();
 sleep(1);
}
?><?php
ob_end_clean();
ob_implicit_flush(true);
for ($i=10; $i>0; $i--)
{
 echo $i;
 sleep(1);
}
?>请注意看上面的ob_implicit_flush(true),这个函数强制每当有输出的时候,即刻把输出发送到浏览器。这样就不需要每次输出(echo)后,都用flush()来发送到浏览器了。

时间: 2024-09-27 19:04:32

php中的输出控制的相关文章

php 缓存机制:输出控制

1. 运行时配置(php.ini)      output_buffering = Off      display_errors = On  2. 函数说明  (1)bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )      此函数将打开输出缓冲.当输出缓冲是活跃的时候,没有输出能从脚本送出(除http标头外),相反输出的内容被存储在内部缓冲区中.内部缓冲区的内容可以用 ob_g

二维数组-请问这段代码中最后输出元素的时候,有必要加个空格吗?

问题描述 请问这段代码中最后输出元素的时候,有必要加个空格吗? static void Main(string[] args) { int[,] score = new int[3, 5]; score[0, 0] = 103; score[1,4] = 80; for (int i = 0; i <3; i++) { for (int j = 0; j < 5; j++) { Console.Write(score[i, j] + " "); Console.WriteL

怎么用java输出控制word循环

问题描述 怎么用java输出控制word循环 package word; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; impor

SAS学习笔记之《SAS编程与数据挖掘商业案例》(4)DATA步循环与控制、常用全程语句、输出控制

SAS学习笔记之<SAS编程与数据挖掘商业案例>(4)DATA步循环与控制.常用全程语句.输出控制 1. 各种循环与控制 DO组 创建一个执行语句块 DO循环 根据下标变量重复执行DO和END之间的语句 DO WHILE 重复执行直到条件为假则退出循环 DO UNTIL 重复执行直到条件为真则退出循环 DO OVER 对隐含下标数组元素执行DO/END之间的语句 END 退出DO或SELECT语句的标志 SELECT 选择执行SAS语句 IF-THEN/ELSE有条件执行一个SAS语句 GO

JavaScript中使用Callback控制流程介绍

 这篇文章主要介绍了JavaScript中使用Callback控制流程介绍,本文讲解了callback的一些问题和优化后的写法并给出代码实例,需要的朋友可以参考下     javascript中随处可见的callback对于流程控制来说是一场灾难,缺点显而易见: 1.没有显式的return,容易产生多余流程,以及由此引发的bug. 2.造成代码无限嵌套,难以阅读. 下面就来说说怎么解决避免上述的问题. 第一个问题是一个习惯问题,在使用callback的时候往往会让人忘了使用return,这种情况

c语言 误差控制-c语言中关于误差控制的问题

问题描述 c语言中关于误差控制的问题 当题目中出现了"Your answer must have a relative or absolute error less than 1e-4."时 ,要将最后结果怎么处理?比如这题:计算误差">然后我写的代码的链接是:http://codepad.org/ygCjrMpS 我测试了样例中的几个情况没发现错在哪里,但是在OJ上提交后 出现 wrong answer on test 7 我觉得可能是因为没有按照题目中的要求&quo

qlineedit-QT中QLineedit输出问题

问题描述 QT中QLineedit输出问题 本人想用lineedit输出一段信息.信息结构是A:23 B:44 C:56其中A,B,C为数据的名称,而数字为程序处理过的变量.但本人只知道Qlineedit的输出方法为line(""abc""this)中间穿插不了经过处理后的数据.所以我想知道有没有什么方法能让我按照我的想法输出.我的输出类似于C中的Printf(""a:%db:%c:%""abc);这样就数据和数据的名称一起输

【翻译】linux中cgroups内存控制子系统memory.oom_control文件

翻译自:redhat文档的部分内容. 新linux内核cgroup的memory子系统提供memory.oom_control来开关cgroup中oom killer,并且提供了消息接口. memory.oom_control 包含一个标志(0或1)来开启或者关闭cgroup的OOM killer.如果开启(1),任务如果尝试申请内存超过允许,就会被系统OOM killer终止.OOM killer在每个使用cgroup内存子系统中都是默认开启的.如果需要关闭,则可以向memory.oom_co

webbrowser-请问下vb.net中如何输出HtmlElement类型的数据

问题描述 请问下vb.net中如何输出HtmlElement类型的数据 For Each i As HtmlElement In web.Document.GetElementsByTagName("a") MessageBox.Show(i.ToString()) 我用这么一段代码,希望把WebBrowser中打开的网页中的内容赋值给变量i,之后在进行更进一步的处理,但是现在我想输出i,想看看到底赋值到底赋值的是什么(精加工一直出错)但是我利用ToString()输出的结果是i的类型