这纯粹是为了更多地了解输出缓冲而已。我想做的是将一个字符串回显给浏览器,睡10秒钟,然后回复其他内容。通常浏览器会等待整整10秒然后发布整个结果,我该如何阻止它?一个例子:
ob_start();
echo "one";
sleep(10);
echo "two";
答案 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睡眠。