【问题标题】:PHP - Unbuffered While() LoopPHP - 无缓冲的 While() 循环
【发布时间】:2013-05-29 03:37:13
【问题描述】:

我正在使用 php,我在 php 中看到 while() 循环。我想问一下我们可以使用while() 循环作为mysql_unbuffered_query()
这段代码很好理解。

<?php
  echo 'While Loop is going to start';
  $i = 0;
  while($i <= 1000){
      echo 'Now number is '.$i;
      $i++;
  }
  echo 'Continue to running script';
?>

当我们首先运行这段代码时会发生什么,这段代码读取while loop is going to start
然后阅读 while 循环并创建要运行的语句Now number is 0.....1000
然后阅读Continue to running script 当代码完成它打印出整个数据。但我不想要这个。
我想要什么。
第一个脚本读取 while Loop is going to start 并打印出来,然后读取 while 循环和
打印出Now number is 0 然后转到Continue to running script 并打印出但是 后端脚本while循环仍在工作,我的意思是while loopcontinue script同时工作。
这让你更了解。
OUTPUT(脚本运行的第一次开始)

 1 - While Loop is going to start
 2 - Now number is 0
 3 - Continue to running script

输出(脚本运行继续)

 1 - While Loop is going to start
 2 - Now number is 0
 3 - Now number is 1
 . - ...............
 1000 - Now number is 1000
 1001 - Continue to running script

这可能是不可能。如果是,我该怎么做。

但也许这可能像mysql_unbuffered_query()
就像当 while 循环完成一个循环时,它会打印出数字,然后打印出另一个,依此类推。
输出(第一次当 while 循环完成一个循环时)

1 - While Loop is going to start
2 - Now number is 0

输出(while循环完成第二个循环)

1 - While Loop is going to start
2 - Now number is 0
3 - Now number is 1

如果可能,请指导我如何做到这一点。
谢谢............

【问题讨论】:

  • 你做的一切都是对的......只需在 echo 语句后添加 flush();
  • 首先不推荐使用mysql。请使用 mysqli 或 PDO。二、为什么不用ob_flush?
  • 我正在使用flush();,但这不起作用。 &lt;?php ini_set('implicit_flush', true); echo 'While Loop is going to start'; $i = 0; while($i &lt;= 1000){ echo 'Now number is '.$i; flush(); $i++; } echo 'Continue to running script'; ?&gt;
  • 你是想说你想在后台线程中运行你的循环吗?

标签: php while-loop


【解决方案1】:

如果您从命令行运行此脚本,输出缓冲总是关闭,隐式刷新总是打开(根据http://us3.php.net/manual/en/outcontrol.configuration.php)。因此,我怀疑您是在 Web 服务器中运行此 PHP。

有几个 PHP INI 值会影响缓冲,因此您可能希望关闭这些功能:

<?php
    ini_set('zlib.output_compression', 'off');
    ini_set('implicit_flush', 'on');
    ini_set('output_buffering', 'off');
    echo "While Loop is going to start.\n";
    $i = 0;
    while($i <= 10){
        echo "Now number is ".$i."\n<br>\n";
        $i++;
        sleep(1);
    }
    echo "\n<br>Finished running script\n\n";
?>

尽管如此,PHP 的行为可能完全符合您的要求,但您的 Web 服务器正在缓冲输出。这个线程可能会感兴趣:php flush not working

如果您使用的是 apache,您可以在 .htaccess 文件中添加一行来关闭 gzip 压缩(它会自动缓冲,直到有足够的数据可以压缩和发送) 我发现这个页面(http://www.bluehostforum.com/showthread.php?18996-Turning-off-Gzip)描述了这个过程,但它基本上说要添加

SetEnv no-gzip dont-vary

到您的 .htaccess 文件。

您能否确认我在上面发布的脚本在您的命令行环境中是否可以正常工作?

另外,如果您在 Web 服务器中工作,请发布您正在使用的 Web 服务器 (IIS/apache/etc)

【讨论】:

    【解决方案2】:

    您需要线程或进程。这是一个好帖子:Does PHP have threading?

    我最喜欢的答案是https://stackoverflow.com/a/14201579/650405

    【讨论】:

      【解决方案3】:

      强制输出到浏览器按此顺序使用以下调用

      ob_flush();
      flush();
      

      但是,它不会在后台进行任何处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-19
        • 2014-05-30
        • 1970-01-01
        • 1970-01-01
        • 2016-11-27
        • 1970-01-01
        • 2017-11-20
        • 2011-08-06
        相关资源
        最近更新 更多