while循环中动态回显字符串


Echo string dynamically in while loop

可能重复:
什么是输出缓冲
为什么PHP一次发送所有内容?

当从列表发送电子邮件时,我想动态地回显"已发送"。我的剧本只有在写完之后才会有回音。如何在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";
    }
}

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

@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";
    }
}

我的剧本只有在写完之后才会有回音。

可能是这样,但您还没有提供足够的信息来确定情况是否如此。

你的问题很可能是这个问题的重复。

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

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

试试这个

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

来自PHP手册:

flush()可能无法覆盖web的缓冲方案服务器,它对中的任何客户端缓冲都没有影响浏览器[…]

像mod_gzip这样的Apache服务器模块可以自己进行缓冲这将导致flush()无法立即发送数据到客户端。

甚至浏览器也可以在显示输入之前对其进行缓冲,例如,缓冲文本,直到它接收到行尾或标记的开头,并且直到可以看到最外面的桌子。

某些版本的Microsoft Internet Explorer将仅开始在收到256字节的输出后显示页面,这样您可能需要在刷新之前发送额外的空白以获取浏览器来显示页面。

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

请阅读不同的注意事项和可能出现的限制,这些限制可能出现在不同的场景和不同的服务器类型中。