PHP - Sleep() 函数的错误

4

我在PHP中使用sleep()函数时遇到了一些问题。

<?php
echo date('h:i:s') . "<br>";

//sleep for 5 seconds
if(1 == 1){
sleep(5);

//start again
echo date('h:i:s');
}
?>

当我运行这段代码时,会停顿5秒钟,然后两个日期粘在一起,而不是先显示一个日期,再停顿5秒钟,最后再显示另一个日期。请问是否有其他替代的方法,可以让它正确地工作?

它对我有效;后者晚了五秒钟。 - Mooseman
1
顺便说一句:通常情况下,您应该避免停止PHP实例。除非这只是用于玩弄浏览器渲染引擎的示例代码,或者您有一个非常特殊的情况,否则sleep()是一个警告信号。只是猜测:您将if语句放在那里,因为您的IDE将sleep()标记为“有味道的”? - VolkerK
2个回答

4
// turn off all layers of output buffering, if any
while (ob_get_level()) {
    ob_end_flush();
}
// some browsers tend to buffer the first N bytes of output, refusing to render until then
// give them what they want...
echo str_repeat(' ', 1024);

echo date('h:i:s') . "<br>";
// force php to flush its output buffers. this also TRIES to tell the webserver to flush, but may not work.
flush();

sleep(5);

echo date('h:i:s');
flush();

你可以在每次调用flush()之前添加更多的空格来提高鲁棒性。我这么说是因为服务器和用户浏览器之间可能有许多层软件,其中任何一层都可能决定缓冲,直到它获得足够的数据来发送它认为是合理大小的网络帧。填充空格可能有助于破坏缓冲。


我有一个模糊的记忆,一篇文章建议将部分输出包装在块元素中,如<p>...</p>(或其他足以确定布局的元素),以使浏览器更有可能立即呈现它 - 尽管可能是完全多余的;-) - VolkerK
@VolkerK 我也记得有类似的事情。很久以前我曾经尝试过这个,有些浏览器在接收到你的 div 或 table 等结束标签之前不会渲染 HTML 块。 - goat

0
你需要输出缓冲区!尝试在顶部使用ob_start,并在每个sleep后使用flush

示例1

ob_start();
echo date('h:i:s') . "<br>";

//sleep for 5 seconds
if(1 == 1){
    sleep(5);
    flush();
    ob_flush();

    //start again
    echo date('h:i:s');
}

示例2

ob_implicit_flush(true);
echo date('h:i:s') . "<br>";

//sleep for 5 seconds
if(1 == 1){
    sleep(5);

    //start again
    echo date('h:i:s');
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接