php实现边执行边输出

sunshi_chun 2009-07-23 10:37:12

ob_start();
for ($i = 0; $i < 100; $i++) {
echo "waiting...<br>";
flush();
ob_flush();
sleep(1);
}
ob_end_flush();

以上这段代码怎么不是慢慢输出的,而是一次就输出了啊???
...全文
835 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2011-07-05
  • 打赏
  • 举报
回复
这与浏览器和服务器都有关,这是一种“投机取巧”的方法,能行时,算你运气;不行时,算你倒霉!
PIGer920 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 roveinlove 的回复:]

虽然是很老前的话题了,还是帮忙给楼上的各位纠正下吧,以免误导后生

首先,可以确定,php.ini output_buffering = Off这样的做法是完全错的(看来都没搞清楚ob的用途)

这只是关闭缓冲区,关闭缓冲区当然会把内容推送到浏览器,但绝不推荐这样的,缓冲区在绝大部分时候是很有用的。

正确的代码应该如下:
PHP code

<?php
ignore_user_……
[/Quote]
你应该将ob_flush 和 flush 一起用吧
服务器端设置了缓存的话 只有flush应该无法立即推送到浏览器端的
roveinlove 2011-07-05
  • 打赏
  • 举报
回复
再补充下,刚发现IE6里有问题,输出一定长度的空格即可解决,完整代码如下:


<?php
ignore_user_abort(true);
header( 'Content-Type: text/html;charset=utf-8' );
echo str_pad("",1000); //输出1000个空格
echo 'begin...<br>';
flush();
for($i=0;$i<10;$i++)
{
echo 'loading '.$i.'0%<br>';
if ( connection_aborted() )
{
exit;
}
flush();
sleep(1);
}

echo 'ok';
roveinlove 2011-07-05
  • 打赏
  • 举报
回复
虽然是很老前的话题了,还是帮忙给楼上的各位纠正下吧,以免误导后生

首先,可以确定,php.ini output_buffering = Off这样的做法是完全错的(看来都没搞清楚ob的用途)

这只是关闭缓冲区,关闭缓冲区当然会把内容推送到浏览器,但绝不推荐这样的,缓冲区在绝大部分时候是很有用的。

正确的代码应该如下:

<?php
ignore_user_abort(true);
header( 'Content-Type: text/html;charset=utf-8' );
echo 'begin...<br>';
flush(); //直接推送到浏览器
for($i=0;$i<10;$i++)
{
echo 'loading '.$i.'0%<br>';
// 如果浏览器已关闭
if ( connection_aborted() )
{
exit; //如果希望关了浏览器后程序继续执行,把这行去掉即可
}
flush();
sleep(1);
}


echo 'ok';


经实验,上面的header是必须的,否则浏览器还是会到执行完毕才显示。
用的是flush,而并非ob_的方法,flush可以把内容直接推送到浏览器,而ob只是推送到apache的缓冲区

程序猿之殇 2009-07-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sunshi_chun 的回复:]
还是不行,是不是php或者apache哪里要设置啊?我也是IE6
[/Quote]
我用的是模拟器,是可以的.
呵呵.
你用ff吧,
这个是可以的.
sunshi_chun 2009-07-23
  • 打赏
  • 举报
回复
php.ini output_buffering = Off已经设置了
Gdj 2009-07-23
  • 打赏
  • 举报
回复
IE6新开的窗口,前256个字节是不立即显示的。你先输出一段无用文字就可以了。

ob_end_clean();
ob_implicit_flush(true);
for($i=0;i<26;$i++) echo "<span></span>";

for ($i=10; $i>0; $i--)
{
echo $i . "<br/>";
sleep(1);
}
sunshi_chun 2009-07-23
  • 打赏
  • 举报
回复
还是不行,是不是php或者apache哪里要设置啊?我也是IE6
程序猿之殇 2009-07-23
  • 打赏
  • 举报
回复
这与浏览器有关.
在ie6,ff2,ff3,我下面的代码可以执行.
但要求php.ini output_buffering = Off才行.

这个就当是玩就行了,没有什么实际意义.

ob_end_clean();
ob_implicit_flush(true);
for ($i=10; $i>0; $i--)
{
echo $i . "<br/>";
sleep(1);
}
dodont 2009-07-23
  • 打赏
  • 举报
回复
正解.
[Quote=引用 3 楼 gdj 的回复:]
IE6新开的窗口,前256个字节是不立即显示的。你先输出一段无用文字就可以了。

ob_end_clean();
ob_implicit_flush(true);
for($i=0;i <26;$i++) echo " <span> </span>";

for ($i=10; $i>0; $i--)
{
  echo $i . " <br/>";
  sleep(1);
}

[/Quote]

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧