在while循环中动态回显字符串[重复]

Posted

技术标签:

【中文标题】在while循环中动态回显字符串[重复]【英文标题】:Echo string dynamically in while loop [duplicate] 【发布时间】:2012-07-19 17:48:28 【问题描述】:

可能重复: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";

    

【问题讨论】:

@symcbean:我们不要有重复的重复。 【参考方案1】:

试试这个

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

来自 PHP 手册:

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

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

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

某些版本的 Microsoft Internet Explorer 只会开始 在他们收到 256 字节的输出后显示页面,所以你 可能需要在刷新之前发送额外的空格来获取那些 浏览器来显示页面。

【讨论】:

抱歉拼写错误(它的 flush() 不是 fflush())【参考方案2】:

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

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

【讨论】:

我记得我在我的 xampp 服务器上使用它时遇到了问题。 @PLB 请参阅我参考的 php 手册页,不幸的是,这并不像在循环结束时拍打 flush() 那样简单,您可能需要处理几个平台依赖项和交互.【参考方案3】:

我的脚本只有在它完成后才会回显。

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

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

没用。不打印任何东西。【参考方案5】:

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

【讨论】:

以上是关于在while循环中动态回显字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 while 循环回显 PHP 数组

为啥这个while循环在输入的每个字符之后重复?

while循环对C++中字符串中的每个单词重复

在熊猫数据框中组合字符串在while-if-elif循环中只工作一次[重复]

循环(while,break,continue),转义字符

forEach函数中的while循环[重复]