2015-09-10 96 views
0

我一直在學習長輪詢,並在閱讀了一些內容後,發現自己有點困惑。我看了解解釋herehere長輪詢混淆

我不太明白在響應之前讓服務器進入睡眠狀態的意義。我知道這個想法是試圖保持客戶端和服務器之間的連接,但是在第二個鏈接中有最高的優先php示例,它有一個代碼片段,服務器只是在一段時間內調用睡眠。

<?php 
/* Send a string after a random number of seconds (2-10) */ 
sleep(rand(2,10)); 
echo("Hi! Have a random number: " . rand(1,10)); 
?> 

睡眠究竟做了什麼?這不僅僅是爲了讓你每次發送請求時,它都會首先進入睡眠狀態(讓服務器什麼都不做),然後做出響應,使其完全像一個標準的http請求,但速度更慢?如果睡眠只是讓服務器在一段時間內不做任何事情,我看不出如何維持連接。每當接收到新信息時,是否需要長時間輪詢來回應客戶?

回答

0

長輪詢是關於服務器沒有響應,直到新數據準備好返回給客戶端(不休眠固定的時間)。

假設您需要從服務中獲取新的信息。您的(輪詢)選項爲: 定期輪詢客戶端以固定的時間間隔發送請求並請求最新的信息。這很容易實現(併發連接的數量可能很容易),但這意味着1)您需要調整用例的間隔時間(準備就緒後需要多久),2)您需要等待數據的最大長度(RTT +延遲間隔),3)發生大量握手

長輪詢客戶端發送請求並等待單個響應。服務器線程將休眠,並在數據可用時通知它,此時它將作爲響應的一部分返回它們。這意味着客戶可用後將在RTT/2時間內獲得數據。但服務器需要保持更多的併發連接。

+0

我明白了。但是在服務器上,如果您只是調用sleep(x),是否不會完全阻止服務器運行x時間? [鏈接](http://www.w3schools.com/php/func_misc_sleep.asp)。我們希望服務器線程進入睡眠狀態,同時檢索我們想要發送給客戶端的數據嗎? – user3125693