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

PHP:在sleep()之前和之后输出数据?,php,sleep,output-buffering,Php,Sleep,Output Buffering,这纯粹是为了学习更多关于输出缓冲的知识,仅此而已。我想做的是向浏览器回显字符串,休眠10秒,然后回显其他内容。通常浏览器会等待整整10秒钟,然后发布整个结果,我该如何停止?例如: ob_start(); echo "one"; sleep(10); echo "two"; 使用-但这将清除缓冲区内容。你不能将延迟注入缓冲区,它就是不能那样工作 您可以一次输出整个缓冲区,也可以保留整个缓冲区供以后使用。不能,因为浏览器正在等待文档的完整版本,因为哪个浏览器引擎正在解析XHTML页面的一半,然后(

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

ob_start();
echo "one";
sleep(10);
echo "two";
使用-但这将清除缓冲区内容。你不能将延迟注入缓冲区,它就是不能那样工作

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

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

您必须在发送头之前考虑通知浏览器,因为二进制数据经过打磨,然后浏览器在recv后获取数据,并可能立即在屏幕上获取这些数据

我不理解这个问题,因为我从来没有想过注入字符串缓冲区10秒睡眠

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

这就是您的意思吗?

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


我认为ob_flush和flush的组合可能会起作用,但缓冲并不是在每个浏览器(如IE)上都得到相同的处理。

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

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

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


如果您想在客户端的某个状态更新UI中使用此发送/休眠周期,则必须找到另一种方法(如长轮询和AJAX)

我使用JavaScript的
setTimeOut()
函数来实现此目的。它很好用。 此外,对于禁用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);
$txt=setPageHeader();//返回新DOCTYPE的PHP函数
//加上(…),
//加上开场白
“一切都完成了。你应该在大约3秒钟内被重定向;
$txt.='';
$txt=$txt.'function redistriger(){document.location.replace(\'http://yoursite.com/yourpage.php?anticaching=“.rand()。\”;}”;
$txt.='setTimeout(\'Rediriger()\',\'3000\');
$txt.='';
$txt.='';
$txt.='';
echo($txt);

这仍然要等到结尾才能输出任何内容。请尝试将其添加到脚本的开头:ob\u implicit\u flush(true);不起作用,但我还是让它起作用了(请参阅对pilif答案的评论),谢谢这不是真的:-“此函数将发送输出缓冲区的内容(如果有)。”是-和“因为调用ob_flush()后缓冲区内容将被丢弃。”我从未说过它只清除缓冲区内容。这只是意味着回显“a”;ob_flush();回波“b”将输出“ab”,而不是“aab”。ob_flush()发送PHP缓冲区中累积的数据,然后清除该缓冲区。但是它被发送出去了,我只是用了一个空格的str_重复,直到256个字节,读了这个就行了,这使得它完美无瑕。虽然我需要在刷新内容之前将\r\n与内容一起发送,以便它工作。感谢您提出发送大量内容的想法。