Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何运行一个长PHP脚本并通过HTTP不断向浏览器发送更新?_Php_Scripting_Timing_Updates - Fatal编程技术网

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

如何运行一个长PHP脚本并通过HTTP不断向浏览器发送更新?,php,scripting,timing,updates,Php,Scripting,Timing,Updates,如何运行一个长PHP脚本并通过HTTP不断向浏览器发送更新 与输出缓冲有关,但我不知道具体是如何实现的。这看起来像是您想要的: 输出缓冲,PHP在您的web服务器准备好后立即将脚本的输出发送到web服务器-这可能是逐行或逐代码块 ob_start()函数用于 创建一个新的输出缓冲区,然后 可以立即开始向它写入 正常打印内容。一旦 你打开了一个缓冲区,有两个 关闭它的方法:ob_end_flush()和 ob_end_clean(),两者都是 缓冲区,但要稍微按 不同的方式。前者结束了战争 缓冲

如何运行一个长PHP脚本并通过HTTP不断向浏览器发送更新


与输出缓冲有关,但我不知道具体是如何实现的。

这看起来像是您想要的:

输出缓冲,PHP在您的web服务器准备好后立即将脚本的输出发送到web服务器-这可能是逐行或逐代码块

ob_start()函数用于 创建一个新的输出缓冲区,然后 可以立即开始向它写入 正常打印内容。一旦 你打开了一个缓冲区,有两个 关闭它的方法:ob_end_flush()和 ob_end_clean(),两者都是 缓冲区,但要稍微按 不同的方式。前者结束了战争 缓冲区,并将所有数据发送到输出, 后者结束缓冲区而不使用 有效地将其发送到输出 清除您保存的所有信息 在那里。每一段文字 当输出缓冲区被激活时输出 open作为 反对被发送到输出。 考虑下面的脚本:


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


输出缓冲考虑的方向是正确的,在发送任何输出之前,使用
ob\u start()
开始输出缓冲,就像在脚本顶部的某个位置使用会话(
session\u start
)一样

然后,您可以使用
ob_flush
flush
继续刷新输出。例如,如果您处于
foreach
循环中,并且在每个循环结束时,您希望输出新行并等待1秒,那么您可以这样做

但也要注意设置时间限制,否则人们可能会在30秒左右的时间后超时


另一个简要说明是,一些浏览器在实际开始显示输出之前需要最小字节数。我不确定它是多少字节,我想大约是4000字节。此外,某些浏览器在关闭某些元素(如表)之前不会呈现它们。因此,刷新在那里也不起作用。

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

例如,一个名为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。我见过这样一个“大”文件上传的方法,发现它很棒

编辑:抱歉,这并没有完全回答最初的问题。


<?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
}
?>

我使用简单的HTTP输出进行页面更新,以使其正常工作:

  • 确保关闭
    中所有打开的元素,否则它将不会显示
  • 将输出的文本包含在元素中(例如
  • 使用输出缓冲和正常冲洗
  • 在Firefox3上测试
这是我的密码:

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();
}

for($nc=0;$nc)浏览器是否会在不等待整个HTML页面下载的情况下显示刷新的输出?因为当我这样做时,浏览器会等待整个页面完成…“某些浏览器需要最少的字节数”--包括Firefox?你是说这种通过HTTP发送更新的技术并不能像在服务器上完成的那样真正更新用户?我不确定哪些浏览器的行为与我想象的一样,我可以告诉你,根据我的经验和观点,这种技术不是最好的/最有效的/可靠的。如果你是abl要使用Javascript,我个人肯定会选择这个解决方案。我已经在Firefox上测试了一些代码,它在不需要4K字节的情况下进行了更新,但您必须确保结束任何打开的元素(在
中),否则它不会显示,您必须将输出的文本包含在一个元素中(例如
)PHP不是为长期运行而设计的。你们为什么需要它?是的,你们需要它的目的是什么?制作一些流媒体服务还是什么?若你们想用信息更新浏览器,那个么使用“AJAX”。
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();
}