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