【问题标题】:Php loop dont update on browser [closed]PHP循环不在浏览器上更新[关闭]
【发布时间】:2013-12-14 00:13:26
【问题描述】:

这是我的一个问题:

循环加载时如何在浏览器(chrome,firefox)上更新页面,例如:

<?php
   $var = 0;
   while($var != 10){
      echo $var;
      $var++;
      sleep(1);
   }

?>

页面不更新,只有在php脚本执行完成后,有什么可以帮助我的吗?谢谢。

【问题讨论】:

  • php 在服务器上运行 - 如果您需要在浏览器窗口中“实时”运行,您需要使用在浏览器中运行的东西(例如 Javascript)。
  • 你到底为什么要在那里使用sleep()
  • @randak 可能只是为了好玩.. 我也这样做了.. 就像测试 longpolling..
  • 您可以在stackoverflow.com/questions/4481235/… 找到解决方案 - 有一些技巧可以刷新输出。

标签: javascript php loops


【解决方案1】:

你可以这样做:

<?php

    if (ob_get_level() == 0) ob_start();

   for ($var = 0; $var <= 10; $var++) {
      echo $var;
      ob_flush();
      flush(); // echo output buffer to client
      sleep(1);
   }

   ob_end_flush();

?>

要完成这项工作,您应该在 PHP 设置中禁用输出压缩,如下所示:

zlib.output_compression = Off

或尝试在代码中禁用它(如果允许):

 if(ini_get('zlib.output_compression'))
    ini_set('zlib.output_compression', 'Off'); 

【讨论】:

  • 缺少{。刚刚在 floris.us/SO/liveEcho.php 上测试过 - 似乎没有用。
  • 是的..谢谢..修复。
  • 修复了{,但请查看我的链接。此代码的精确副本(带有 { ) - 在我的浏览器上,它会立即显示出来(10 秒后)。
  • 是的,这取决于您的服务器设置。
  • 您可能希望将该信息添加到您的答案中。 "当您有这些服务器设置时,以下代码可以工作:"
【解决方案2】:

这基本上是不可能的。

PHP 在其引擎中使用自己的输出缓冲 (php://output)。该缓冲区被您在代码中回显的数据填满。一旦引擎到达脚本的末尾,它将刷新整个缓冲区并将其附加到网络服务器开始创建的标头信息中(想象它是网络服务器准备响应浏览器和 PHP是添加实际内容的人)。

另一个限制是某些浏览器会等到整个 HTTP 请求完成后才开始渲染站点。并非所有人都这样做,但有些人这样做。

对于真正的现场表演,我会推荐 AJAX 或更现代的 WebSockets。第二个更活跃,因为它不会像 AJAX 那样定期重新加载。我建议您重新考虑您要做什么,以及是否有必要。

如果你有什么不明白的地方,我建议你看一些维基百科的文章:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多