2014-03-29 126 views
4

我在使用PHP中的sleep()函數時遇到了一些問題。PHP - 睡眠錯誤()

<?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秒的停頓,然後下一個日期。

有沒有其他方法可以寫這個,所以它能正常工作?

+0

它適用於我;後者是五秒鐘後。 – Mooseman

+1

btw:通常你應該避免停止你的php實例。除非這只是用於瀏覽器渲染引擎的示例代碼,或者您有一個非常特殊的情況,'sleep()'是一個紅旗。只是瘋狂的猜測:你已經把'if'語句放在那裏,因爲你的IDE把sleep()標記爲「臭」? – VolkerK

回答

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(); 

您可以通過每次調用之前呼應多個空格提高穩健性去衝()。我這樣說是因爲在服務器和用戶瀏覽器之間可能有很多層軟件,並且這些層中的任何層都可能決定進行緩衝,直到獲得足夠的數據來發送感覺是合理大小的網絡幀。用空格填充可能有助於顛覆緩衝。

+0

我有一篇文章模糊的記憶,建議將部分輸出包裹在像'

...

'這樣的塊元素中(或者其他決定佈局「充分」的東西),以使瀏覽器更有可能立即渲染 - 找不到它,可能是完全多餘的;-) – VolkerK

+0

@VolkerK我想我也記得類似的東西。我知道很久以前,我玩過這個遊戲,有些瀏覽器直到你的div或table等的結束標記被接收到時纔會呈現HTML塊。 – goat

+0

非常感謝,它的工作! – user3416605

0

您需要輸出緩衝區!儘量塗用ob_start頂部,每個sleepflush

例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'); 
}