2012-06-15 84 views
5

首先,我想感謝大家,對於新程序員的幫助很大。這是長輪詢的正確方法(Comet編程)

我有一個長輪詢的問題。我研究了一些關於彗星編程的長輪詢技術。該方法對我來說似乎很難,因爲它有時還需要在服務器端安裝一些腳本。

現在我找到了一個長輪詢的例子。它的工作很好,但我不確定它是否是正確的方法。示例腳本是關於類似聊天的應用程序。這個PHP腳本的工作原理如下:

  1. php腳本不斷檢查data.txt文件,直到它被更改。
  2. 只要更改data.txt,新文本就會輸出到網頁上。

下面是PHP腳本:

<?php 
$filename = dirname(__FILE__).'/data.txt'; 

// store new message in the file 
$msg = isset($_GET['msg']) ? $_GET['msg'] : ''; 
if ($msg != '') 
{ 
    file_put_contents($filename,$msg); 
    die(); 
} 

// infinite loop until the data file is not modified 
$lastmodif = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0; 
$currentmodif = filemtime($filename); 
while ($currentmodif <= $lastmodif) // check if the data file has been modified 
{ 
    usleep(500000); // sleep 500ms to unload the CPU 
    clearstatcache(); 
    $currentmodif = filemtime($filename); 
} 

// return a json array 
$response = array(); 
$response['msg']  = file_get_contents($filename); 
$response['timestamp'] = $currentmodif; 
echo json_encode($response); 
flush(); 
?> 

我不包括網頁代碼保持簡單的問題。該網頁只有一個div,它顯示data.txt的文本,只要它被更改。我的問題的

要點是:

  • 這是循環法適當的方法來長輪詢服務器
  • 此外,當服務器正在執行sleep();其他同時發生的請求會發生什麼情況?
  • 是否有任何技術來減少由於長時間輪詢的連續腳本的服務器負載?
  • 如果客戶端啓動這個長輪詢請求斷開連接,我們如何才能知道並停止相應的斷開客戶端的腳本

請指導我這個問題...謝謝

回答

5

是的,這是一個想法。您應該記住,該腳本不會結束,並且每個用戶都會生成一個PHP實例。我在v8cgi服務器端使用longpoll邏輯。客戶端啓動XMLHttp請求(XHR)後,服務器開始檢查新的輸入的間隔。我已經添加了一個計時器服務器端,每隔5分鐘發送一個響應,之後客戶端(如果沒有斷開連接)重新發送XHR並重復該過程。

因此,服務器端機制的每個實例運行時間不會超過5分鐘,因爲如果客戶端斷開連接,服務器在5分鐘後發送的響應之後不會有新的XHR。

的過程是這樣的:

  • 客戶端發送XHR
  • 服務器產卵定期處理的檢查更新
  • 如果一些更新,必須派:服務器發送響應
    • 客戶端進程響應,並重新啓動XHR
    • 服務器更新週期性派生過程和檢查
  • 如果5分鐘內沒有更新通過:
    • 服務器發送響應並退出衍生的進程
    • 客戶端進程(空)響應一個重新啓動XHR
    • 服務器派生新的進程,並開始檢查
  • 如果某些更新必須被髮送:服務器發送響應
  • [...]
  • 如果5分鐘過去了出更新:
  • [...]
  • ,直到客戶端斷開(=服務器的響應後,沒有新的XHR)
+0

感謝您的答覆的專用服務器。延遲實際上是500毫秒,即0.5秒。請注意,只要客戶端瀏覽器打開該頁面,該腳本就會開始執行檢查和更新程序。如果有例如1000個客戶端瀏覽器同時打開,服務器必須連續發送響應。我們如何檢查php腳本中是否有任何客戶端斷開連接,並停止腳本以保持腳本對所有其他在線客戶端開放。請解釋一下 –

+0

還在等待你的回覆(因爲看起來這裏只有少數人知道長時間輪詢,爲什麼我沒有得到任何答案)。請與我分享您的longpoll技術。我會非常感激。我們如何檢查php腳本中是否有任何客戶端斷開連接,並停止腳本以保持腳本對所有其他在線客戶端開放。請幫忙! –

+0

我已經在我的問題中添加了一些解釋,請回顧一下 –

1

是的,這是一個簡單而方便的方式做到這一點,它是不正確的方法,但不是最好的主意。因爲它會受到影響,並且會隨着用戶的增加而導致許多問題。

和共享主機,這不是一個好主意,要做到這一點,這種方法將正常工作,只有當用戶不是數額巨大的,如果你有自己的服務器。如果你在共享主機服務器使用此方法,那麼你可能會面臨最大的服務器資源使用,或會話鎖定問題和HTTP服務可能在一段時間內無法使用。

,或者您可以使用現有的API,聊天應用程序,或者有可以運行這些腳本像node.js和類似服務器模塊

+0

感謝您的答案和提示。 –

相關問題