對這個問題感興趣 - 如何正確停止一個帶有睡眠的while循環。 我實施了「長輪詢」的事實,以快速更新網站上的信息(警告,其他信息)。停止一段時間的循環php
腳本
的本質,我們將發送GET請求到PHP頁面中的腳本所在。
2.該腳本運行循環而。
3.在這個系列有條件和結束睡眠(1),該暫停循環的執行。
-如果循環運行多個秒 - 停止循環,分別執行,和腳本。
-如果您的網站有新信息,請說「警報」 - 將結果導出給用戶並停止循環。
問題 如果用戶關閉瀏覽器窗口,或者重新加載頁面 - 一個新的查詢上的腳本,這將再次啓動週期執行。但在這種情況下,先前執行的循環而不會停止,直到它們至少有一個條件工作。如果用戶發送大量請求到頁面 - 服務器的內存開始啓動,並且結果全部掛起,直到所有而都不會停止執行。
問題 如何停止循環和腳本作爲一個整體,當你運行頁面時會重載或客戶端? 雖然目前我做了以下。 當您運行我們生成的腳本時,會收到一個分配給該變量的隨機數,並且與會話相同。進一步向內陸地區做一個條件,其中變量必須是會話的值。如果錯誤 - 停止循環。 如果我們在新的腳本上運行腳本 - 會話的值發生變化,並因此停止前的所有性能。 我可以使用該選項嗎?多少安全?
UPDATE.PHP
// Initialize the user's session
$session = Session::instance();
$rand = rand();
$session->set('user_update_key', $rand);
$key = $rand;
$limit = 20;
$seconds = 0;
set_time_limit($limit + 1);
while (TRUE) {
if (Session::instance()->get('user_update_key') == $key) {
if (there are updates. if there is - output) {
echo 'update information';
flush();
exit;
}
if ($seconds == $limit) { // complete the loop at the expiration of the time.
echo 'Close';
flush();
exit;
}
$seconds++;
} else {
unset($session, $rand, $key, $notice, $mysession, $last_notice, $limit, $notise_return, $seconds);
flush();
exit;
}
session_write_close();
sleep(1);
session_start();
}
'while(TRUE)'< - 確定你不需要這個,是嗎? –
您可以繼續使用;用於終止循環內循環的關鍵字。 – Ali
你真的需要session_write_close();/session_start(); ?更新過程如何啓動,是否可以簡單地設置30秒的超時時間? – Adder