在while循环中动态回显字符串

时间:2012-07-20 12:37:47

标签: php

  

可能重复:
  what is output buffering?
  Why does PHP send it all at once?

我希望在从列表发送电子邮件时动态回显“已发送”。完成所有后,我的脚本只回声。如何在while循环中动态回显字符串?

$f=fopen("list.txt","r");

if($f){

    while (!feof($f)) {

        $line = fgets($f, 4096);

        $lncount++;

        $val = $lines[$lncount];

        mailsender($line,$yollayan,$sifresi,$name);

        echo "sent";

    }
}

5 个答案:

答案 0 :(得分:3)

您需要设置输出以进行缓冲。试试下面的脚本。确保切换输出的压缩以查看实时输出。

@apache_setenv('no-gzip', 1); 
@ini_set('zlib.output_compression', 0);
ob_implicit_flush(true);
ob_end_flush();

$f=fopen("list.txt","r");

if($f){

   while (!feof($f)) {

        $line = fgets($f, 4096);
        $lncount++;
        $val = $lines[$lncount];
        mailsender($line,$yollayan,$sifresi,$name);
        echo " sent";
    }
}

答案 1 :(得分:1)

试试这个

  echo "Sent ";
  echo str_repeat("\n",1024);
  flush();

从PHP手册:

  

flush()可能无法覆盖您网络的缓冲方案   服务器,它对任何客户端缓冲没有影响   浏览器。 [...]

     

像mod_gzip这样的Apache服务器模块可以自己缓冲   这将导致flush()不会导致数据立即发送   给客户。

     

即使是浏览器也可以在显示之前缓冲其输入。网景   例如,缓冲文本,直到它收到行结束或   标记的开头,它不会呈现表,直到标记   看到最外层的桌子了。

     

某些版本的Microsoft Internet Explorer才会启动   在收到256字节的输出后显示页面,所以你   可能需要在刷新之前发送额外的空格才能获得这些空格   浏览器显示页面。

答案 2 :(得分:1)

  

我的脚本只有在完成所有内容后回声。

它可能会 - 但你没有提供足够的信息来确定是否是这种情况。

您的问题很可能与this one重复。

如果在echo之后添加flush()并从命令行运行它,您将看到进度。

答案 3 :(得分:1)

您可以使用回显下方的flush();将其发送到浏览器:http://php.net/manual/en/function.flush.php(阅读链接上的评论以获取更多信息)。

答案 4 :(得分:0)

您看到的效果是输出缓冲。调用flush()函数强制php发送待定输出。

请阅读不同情况和不同服务器类型可能出现的不同警告和可能的限制。