2012-11-06 68 views
0

這個PhP腳本是長時間輪詢的合法方法嗎?或者這對服務器很重?這是一個合法的長輪詢方法嗎?

$FoundNewContent = false; 

$tokens = array(); 

while(!$FoundNewContent) { 
    usleep(300000); 
    clearstatcache(); 
    $SQL1 = "SELECT * FROM tokens WHERE ID > ".$_GET['tokenID']; 
    $result1 = mysql_query($SQL1); 
    while($row1 = mysql_fetch_array($result1, MYSQL_ASSOC)) { 
     array_push($tokens, $row1); 
     $FoundNewContent = true; 
    } 
} 

// Parse XML array  

flush() 

我正在通過Ajax調用此腳本。

+0

你沒有做任何事情,如果'$ FoundNewContent'是'真'。之後你正在沖洗。什麼是輸出?只是空白? –

+0

實際上在while循環和flush之間解析一個xml數組,然後在jQuery中處理 – matteok

+0

你沒有迴應任何事情嗎?我的意思是...我不確定... –

回答

1

取決於您的服務器設置 - 只要您不使用會話,它應該可以正常工作,但是如果一次連接太多,可能會導致服務器停止運行。

此外,我會添加一個時間限制,它不返回任何內容並重新啓動輪詢。否則,如果沒有添加數據並且服務器超時設置爲無限制,腳本可能會永久運行。我通常會增加30秒的限制。

喜歡的東西:

$FoundNewContent = false; 
$tokens = array(); 
$time = time(); 
while(!$FoundNewContent) { 
    usleep(300000); 
    clearstatcache(); 
    $SQL1 = "SELECT * FROM tokens WHERE ID > ".$_GET['tokenID']; 
    $result1 = mysql_query($SQL1); 
    while($row1 = mysql_fetch_array($result1, MYSQL_ASSOC)) { 
    array_push($tokens, $row1); 
    $FoundNewContent = true; 
    } 
    if($time<time()-30) break; 
} 
flush() 
+0

的會話,如同在「session_start()」中那樣,然後是使用一個會話。 – matteok

+0

是的 - 如果你使用session_start(),那麼我的經驗是你需要在循環之前的某處運行session_write_close(),否則腳本會窒息。 session_write_close()會阻止你更改會話中的東西,所以如果你必須這樣做,請先使用session_start(),然後再使用session_write_close()。 – smokiespartakus

+0

因此,如果我每次有大約10到15個客戶端輪詢內容,那麼每秒會有30到45個mysql SELECT請求,我不必擔心? – matteok

相關問題