你如何运行一个长PHP脚本并继续通过HTTP向浏览器发送更新?

时间:2010-06-08 09:24:05

标签: php scripting timing updates

如何运行长PHP脚本并继续通过HTTP向浏览器发送更新?

与输出缓冲有关,但我不确切知道如何。

5 个答案:

答案 0 :(得分:3)

输出缓冲正在考虑正确的方向,您可以在发送任何输出之前,使用ob_start()开始输出缓冲,就像在脚本顶部某处使用会话(session_start)一样。 / p>

然后,您可以使用ob_flushflush来保持刷新输出。例如,如果您处于foreach循环中,并且在每个循环结束时您想要输出新行并等待1秒,那么您可以这样做。

但也要看set_time_limit,否则人们可能会在30秒左右后遇到超时。

另一个快速说明,某些浏览器在实际开始显示之前需要最少的输出字节数。我不确定它是多少字节,我认为它大约是4000.此外,有些浏览器在关闭之前不会呈现某些元素(如表格)。因此,冲洗也不会起作用。

答案 1 :(得分:2)

这看起来像你所追求的:

  

输出缓冲,PHP一旦准备就将脚本的输出发送到您的Web服务器 - 这可能是代码块逐行或代码块。

Output Buffering

  

ob_start()函数用于   创建一个新的输出缓冲区,和你   可以立即开始写它   正常打印内容。一旦   你有一个缓冲打开,有两个   关闭它的方法:ob_end_flush()和   ob_end_clean(),两者都结束了   缓冲区,但稍微这样做   不同的方法。前者结束了   缓冲并将所有数据发送到输出,   而后者没有结束缓冲区   有效地将其发送到输出   消除您保存的任何信息   在那里。每一段文字   在输出缓冲器输出时输出   open被放入缓冲区中   反对被送到产出。   请考虑以下脚本:

<?php
  ob_start();
  print "In first buffer!\n";
  ob_end_flush();
  ob_start();
  print "In second buffer!\n";
  ob_end_clean();
  ob_start();
  print "In third buffer!\n";
?>
  

该脚本将输出“首先   缓冲区“因为第一个文本是   放入缓冲液然后冲洗   ob_end_flush()函数。 “在第二个缓冲区”   但是,不会打印出来,因为   它被放入一个缓冲区   使用ob_end_clean()清理而不是   发送到输出。最后,脚本   将打印出“在第三缓冲区”   因为PHP会自动刷新打开   到达结尾时输出缓冲区   一个剧本。

答案 2 :(得分:1)

您还可以拥有一种后台任务,以及一个为您提供进度的界面。

例如,一个名为job.php的页面

<?php
    for ($i=0; $i<100; ++$i)
    {
       store($i);
       // long stuff
       sleep(42);
    }
?>

和progress.php

<?php
      return get($i);
?>

然后一些ajax调用progress.php?task = mytaskid并更新GUI。我已经看到了这种“大”文件上传的方法,发现它很棒。

编辑:对不起,这并没有完全回答最初的问题。

答案 3 :(得分:1)

<?php
# try this...
for (;;) {
  echo time() . '<br>';
  ob_flush(); # http://php.net/ob_flush
  flush(); # http://php.net/flush
  sleep(1); # http://php.net/sleep
}
?>

答案 4 :(得分:1)

我通过简单的HTTP输出得到了页面更新,以使其正常工作:

  • 确保关闭<body>中的所有未处理元素 - 否则将无法显示
  • 将输出的文本括在元素(例如<p>
  • 使用输出缓冲&amp;正常冲洗
  • 在Firefox 3上测试

这是我的代码:

for ($nc=0; $nc<10; $nc++){

    // delay just to test
    sleep(1);

    // send message to browser
    ob_end_clean();
    ob_start();
    echo "<p>Update ".$nc."</p>";
    ob_end_flush();
    flush();
}