PHP:sleep()之前和之后的输出数据?

时间:2010-09-10 15:07:48

标签: php sleep output-buffering

这纯粹是为了更多地了解输出缓冲而已。我想做的是将一个字符串回显给浏览器,睡10秒钟,然后回复其他内容。通常浏览器会等待整整10秒然后发布整个结果,我该如何阻止它?一个例子:

ob_start();
echo "one";
sleep(10);
echo "two";

6 个答案:

答案 0 :(得分:5)

faileN的答案在理论上是正确的。如果没有ob_flush(),数据将保留在PHP的缓冲区中,并且在请求结束时隐式刷新缓冲区之前不会到达浏览器。

它仍然不起作用的原因是因为浏览器也包含缓冲区。数据现在已正确发送,但浏览器在实际启动渲染之前等待“one”之后。否则,由于连接速度慢,页面渲染会非常非常慢。

解决方法(以说明它正常工作)当然是一次发送大量数据(可能是一些巨大的HTML注释或其他内容),或者在命令行上使用像curl这样的工具。

如果要在客户端上使用此发送/休眠周期进行某些状态更新UI,则必须找到另一种方式(如长轮询和AJAX)

答案 1 :(得分:3)

ob_start();
echo "one";
ob_flush();
sleep(10);
ob_start();
echo "two";

这是你的意思吗?

答案 2 :(得分:1)

如果我理解正确,你试图在屏幕上打印部分响应,等待10秒并输出其余部分,这一切都是在页面加载时。这将需要一些客户端脚本,因为PHP将在最后输出整个响应。

我认为ob_flush和flush的组合可能会起作用,但是在每个浏览器(例如IE)上缓冲的处理方式都不一样。

答案 3 :(得分:1)

我使用JavaScript的setTimeOut()函数。它工作正常。 此外,您可以将<noscript>标记用于禁用JavaScript的浏览器。

 $txt = setPageHeader();  // a PHP function that returns a new DOCTYPE
                          // plus <html><head>(...)</head>, 
                          // plus an opening <body> tag

echo 'All things were completed. You should be redirected in about 3 seconds';

  $txt .= '<script type="text/javascript">';
  $txt = $txt.'function Rediriger() {document.location.replace(\'http://yoursite.com/yourpage.php?anticaching='.rand().'\');}';
  $txt .= 'setTimeout (\'Rediriger()\', \'3000\')';
  $txt .= '</script>';
  $txt .= '<noscript><a href="http://yoursite.com/yourpage.php?anticaching='.rand().'">Javascript is disabled in your browser. Click here for being redirected.</a></noscript>';
  $txt .= '</body></html>';
  echo ($txt);

答案 4 :(得分:0)

使用ob_flush() - 但这将清除缓冲区内容。你不能将延迟注入缓冲区,它只是不起作用。

您可以立即输出整个缓冲区,也可以保留整个缓冲区供以后使用。

答案 5 :(得分:0)

不能因为浏览器等待完整版本的文件,因为什么浏览器引擎解析了一半的XHTML页面和之后(如何渲染一半的XML?)阅读其他部分。

<击>

你必须先考虑发送标题,然后通知浏览器,因为二进制数据已经打磨,然后浏览器会在recv之后获取数据,并且可以立即在屏幕上获取这些数据。

我想念这个问题,因为我从不考虑注入字符串缓冲区10s睡眠。