2014-10-05 57 views
0

我明白睡眠是如何工作的,但它在事情發生之前就起作用了。比如說我有幾個回聲和郵件以及其他一些東西。然後有一個睡眠,然後重定向。那麼,它看起來像睡眠第一,然後一切只是垃圾郵件,並導致服務器CPU增加。有沒有類似於睡眠的東西,在事情沒有執行之後不會起作用?無法控制的睡眠? PHP

例如

echo 'Hey'; 
sleep(3); 
echo 'My next text after 3 seconds is up'; 

好,這一點,這是不行的,而且它使用C#一樣的東西。

發生這種情況時,頁面將不會響應3秒,然後兩條消息「嗨」&「我的下一個文本3秒鐘後到」將一次顯示全部。即時通訊使用這個錯誤的東西?有什麼我應該使用?

因爲我從來沒有使用睡眠,我看到很多人用它來做同樣的事情,它的工作原理,但在我的情況下,它並不像我認爲的那樣工作。

PHP不是C#

+4

這種情況發生在響應*緩衝*時。在任何情況下,這都不適合使用睡眠,並且在寫入其他頭文件後發出重定向是無效的(因此如果它沒有被緩衝,它將會中斷)。 – user2864740 2014-10-05 05:04:15

+0

除了我可以使用的睡眠之外,還有什麼?或者緩衝區是我應該使用的?因爲我在使用睡眠時使用了ob_start和flush,但仍然以相同的結果結束 – 2014-10-05 05:05:31

+1

真的應該儘快生成(並返回)所有HTTP/HTML響應,即。沒有睡覺。我不確定在這裏試圖解決什麼樣的睡眠問題;並且如上所述,即使立即寫入,在這種輸出開始之後發出重定向也是無效的。 – user2864740 2014-10-05 05:07:26

回答

0

你可以通過刷新點輸出來實現。您也可以使用ob_implicit_flush來達到這個目的,這可以確保輸出在每次輸出調用時都被刷新,而不需要顯式調用flush。

header('Content-type: text/html; charset=utf-8'); 
echo 'Hey'; 

for($i=0;$i<60;$i++){ 
    echo "<br />My next text after $i seconds is up"; 
    ob_flush(); 
    flush(); 
    sleep(1); 
} 

注意php docs for ob_flush suggests,你應該嘗試把Content-Type頭當事情不工作。但上面的代碼工作沒有這也。

0

它完全按照程序運行,事情是,輸出被緩衝。您必須禁用緩衝,並強制flush()確保其在sleep()之前發送。

while (@ ob_end_flush()); // closes all existing buffers if any 
echo 'Hey'; 
flush(); // make sure it was flushed to the client 
sleep(3); 
... 

而且還可能不是在所有情況下工作,因爲那裏有另一個緩衝區,而這一次你無法控制:瀏覽器。一些瀏覽器不會呈現任何HTML,除非它已經收到了一定的最小數量的數據。