2

可能重复:
什么是输出缓冲?
为什么 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";

    }
}
4

5 回答 5

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";
    }
}
于 2012-07-20T12:43:16.927 回答
1

尝试这个

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

来自 PHP 手册:

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

Apache 的服务器模块(如 mod_gzip)可能会自己进行缓冲,这将导致 flush() 不会导致数据立即发送到客户端。

甚至浏览器也可以在显示之前缓冲它的输入。例如,Netscape 会缓冲文本,直到它接收到行尾或标记的开头,并且在看到最外层表格的标记之前不会呈现表格。

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

于 2012-07-20T12:39:27.260 回答
1

我的脚本仅在完成所有操作后才会回显。

可能确实如此 - 但您没有提供几乎足够的信息来确定是否是这种情况。

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

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

于 2012-07-20T12:43:05.430 回答
1

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

于 2012-07-20T12:45:01.870 回答
0

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

请阅读在不同场景和不同服务器类型中可能出现的不同警告和可能的限制。

于 2012-07-20T12:41:11.603 回答