2011-06-16 59 views
2

我想實現一個在Symfony框架中使用長輪詢概念的API。用Symfony實現長輪詢API

假設我有一個只能增長的表'feeds'(假設用戶可以從其他界面插入他們的feed)。 我想創建一個客戶端實時更新頁面。我們的想法是以下內容:

  1. 客戶端發送AJAX請求與上次修改的時間戳(第一次發送0)
  2. 服務器客戶端的時間戳進行比較,以時間戳,以檢索與一個比發送更大的時間戳的所有消息由用戶
  3. 如果有更新的消息,立即將它們返回給客戶端,並帶有最新的消息的時間戳 另一方面,如果沒有新消息,則進入2分鐘忙等待循環,檢查每1-3秒(隨機)是否有新消息。
  4. 當客戶端接收到服務器應答時,瀏覽器更新視圖並立即發送一個新的ajax請求。

換句話說,服務器不是每隔x秒發送一次AJAX呼叫,而是保存請求直到它爲我們提供新信息。

對Symfony有很好的使用經驗我試着實現這個api的簡單演示,而且效果很好。我有會話阻塞的問題(Ajax調用被保持對服務器的訪問是不可能的),所以我只是增加了以下的動作:

public function executeIndex(sfWebRequest $request) 
{ 
    session_write_close(); 
     : 
     : 

(見this link

然後我測試了對API的大量訪問。 100個用戶工作正常,1000個一切崩潰。 我意識到,我有兩個問題:

  1. 對於每一個新的數據庫連接打開
  2. 對於每個訪問服務器執行一個新的進程

因爲我試圖把第一個問題訪問persistent: true在我的database.yml主義connetor。當我監視服務器連接時,我看到每個對API的訪問都會打開一個新的連接。所以基本上我仍然受到同樣的兩個問題的阻礙。

有沒有人有任何想法或經驗與此問題?或者,也許我應該放棄使用Symfony實現我的api的想法?

回答

0

我認爲使用symfony這是錯誤的方法。使用套接字會容易得多。

例如看看nodejsape-project(彗星)

他們都能夠處理更多的電流用戶比Apache,lighttpd的nginx的或...

0

的Apache爲每個用戶創建不同的線程並且每個線程都有獨立的數據庫連接。這就是爲什麼db連接很高的原因