【发布时间】:2011-04-10 18:56:24
【问题描述】:
这纯粹是为了了解有关输出缓冲的更多信息,仅此而已。我想做的是向浏览器回显一个字符串,休眠 10 秒,然后回显其他内容。通常浏览器会等待整整 10 秒,然后发布整个结果,我该如何停止呢?一个例子:
ob_start();
echo "one";
sleep(10);
echo "two";
【问题讨论】:
标签: php sleep output-buffering
这纯粹是为了了解有关输出缓冲的更多信息,仅此而已。我想做的是向浏览器回显一个字符串,休眠 10 秒,然后回显其他内容。通常浏览器会等待整整 10 秒,然后发布整个结果,我该如何停止呢?一个例子:
ob_start();
echo "one";
sleep(10);
echo "two";
【问题讨论】:
标签: php sleep output-buffering
faileN 的回答在理论上是正确的。如果没有ob_flush(),数据将保留在 PHP 的缓冲区中并且不会到达浏览器,直到缓冲区在请求结束时被隐式刷新。
它仍然不起作用的原因是浏览器也包含缓冲区。数据现在已正确发送,但浏览器在获得“一”后等待,然后才真正开始渲染。否则,由于连接速度较慢,页面渲染会非常非常慢。
解决方法(说明它工作正常)当然是一次发送大量数据(可能是一些巨大的 html 注释或其他东西)或在命令行上使用 curl 之类的工具。
如果您想在客户端的某些状态更新 UI 上使用此发送/睡眠周期,则必须找到另一种方式(如长轮询和 AJAX)
【讨论】:
ob_start();
echo "one";
ob_flush();
sleep(10);
ob_start();
echo "two";
你是这个意思吗?
【讨论】:
如果我理解正确,您正在尝试在屏幕上打印部分响应,等待 10 秒并输出其余部分,所有这些都在页面加载时进行。这将需要一些客户端脚本,因为 PHP 将在最后输出整个响应。
我认为 ob_flush 和 flush 的组合可能会起作用,但缓冲在每个浏览器(例如 IE)上的处理方式不同。
【讨论】:
我为此使用了 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);
【讨论】:
使用ob_flush() - 但这会清除缓冲区内容。您不能将延迟注入缓冲区,它只是不能那样工作。
您要么一次输出整个缓冲区,要么保留整个缓冲区以供以后使用。
【讨论】:
不能因为浏览器等待完整版本的文档,因为什么浏览器引擎解析了 XHTML 页面的一半,然后(如何呈现 XML 的一半?)读取其他部分。
在通知浏览器之前,您必须考虑发送标头,因为二进制数据已被打磨,然后浏览器在 recv 之后获取您的数据,并可能立即在屏幕上获取此数据。
我想念这个问题,因为我从没想过注入到字符串缓冲区 10s sleep。
【讨论】: