4

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

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

6 回答 6

5

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

它仍然不起作用的原因是浏览器还包含缓冲区。数据现在已正确发送,但浏览器在获得“一”后等待,然后才真正开始渲染。否则,由于连接速度较慢,页面渲染会非常非常慢。

当然,解决方法(说明它工作正常)是一次发送大量数据(可能是一些巨大的 html 注释或其他东西)或在命令行上使用 curl 之类的工具。

如果您想将此发送/睡眠周期用于客户端上的某些状态更新 UI,则必须找到另一种方式(如长轮询和 AJAX)

于 2010-09-10T15:52:45.140 回答
3
ob_start();
echo "one";
ob_flush();
sleep(10);
ob_start();
echo "two";

你是这个意思吗?

于 2010-09-10T15:13:34.450 回答
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);
于 2012-01-20T17:23:26.850 回答
1

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

我认为 ob_flush 和 flush 的组合可能有效,但缓冲在每个浏览器(例如 IE)上的处理方式不同。

于 2010-09-10T15:21:55.673 回答
0

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

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

于 2010-09-10T15:13:13.653 回答
0

不能因为浏览器等待完整版本的文档,因为什么浏览器引擎解析了 XHTML 页面的一半,然后(如何呈现 XML 的一半?)读取其他部分。

您必须在通知浏览器之前发送标头,因为二进制数据已被打磨,然后浏览器在 recv 之后获取您的数据,并立即在屏幕上获取此数据。

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

于 2010-09-10T15:13:19.553 回答