2011-11-11 27 views
5

我正在一個網站上顯示一些來自數據庫的頻繁更改的數據(隊列狀態和聊天對話)。我目前的設置是Apache/PHP/MySQL。當然,我希望避免每隔x秒輪詢服務器,因爲這不能很好地擴展。我想做反向ajax長輪詢,但是,我讀過Apache不能很好地工作,因爲它很快用完了工作線程。有很多其他Web服務器可以解決這個問題:nginx,tornado等。但是,我的問題是,PHP是我所知道的唯一的服務器端腳本語言。此外,我已經寫了一些PHP腳本,所以我想盡可能保留它們。只要我仍然可以使用PHP,我就可以使用切換服務器。但是在做了一些更多的研究之後,我讀過人們說PHP(PHP-FPM?)也爲每一個請求創建了一個進程,這意味着如果我有成百上千個打開的連接,將會有數百個/成千上萬的進程,這也是一個問題。php是否可以通過反向ajax長輪詢進行擴展?

我可以得出結論嗎?沒有很好的可擴展的方法來使用PHP進行長查詢網站?我應該放棄PHP並學習另一種服務器腳本語言嗎?我現在可以繼續使用當前的設置(Apache/PHP)開展長輪詢,但是我不希望腳本語言的選擇在部署時對我的系統的可伸縮性造成任何限制。所以我該怎麼做?我對網絡編程並不是很有經驗,所以如果有哪位大師可以給我一些提示,我會很感激!謝謝!

+1

自己沒有這樣做,但會使用js套接字是一個選項?也許也使用node.js。 原生支持瀏覽器中的websockets是iproving,但我猜jQuery插件處理? –

+0

我並沒有真正考慮websocket,因爲它在所有主流瀏覽器上都不支持。實際上,我研究過node.js,但是從我聽說它還比較新,所以對框架的支持更加有限。我目前正在考慮Django,這意味着我必須接受python。我聽到了有關框架的好消息,但是如果有辦法解決性能問題,我仍然傾向於使用php。 – pinghsien422

+0

我肯定會重新考慮node.js - 一個簡單的ajax請求到服務器端口node.js正在運行可能只是一個竅門。 –

回答

7

在php-fpm模式下運行的PHP仍然有限制,特別是如果你的代碼吃了很多內存。沒有一些可用的內存,您將無法運行數千個並行進程。但它通常比mod_php執行得更快,並且至少不需要PHP的HTTP請求由Web服務器處理,如果該Web服務器是nginx,則會獲得更多的並行HTTP請求。

對於php-fpm,您還將有一個等待請求隊列,在臨時大流量的情況下可能有用,至少請求排隊,不會被拒絕。

現在長時間的輪詢操作對於nginx(或其他人,這只是一個例子)是可以的,但對於PHP來說並非如此。 PHP並不是一個長期運行的服務器,每個請求都是一個新進程,對於KeepAlive來說這確實不是正確的選擇。但是「鴻溝」(分割和規則)。您的長輪詢任務可能會在您的PHP應用程序附近運行,但無需您的PHP應用程序。

舉一個例子來看jappix project,這是一個PHP項目。但是你需要在某個地方放置一個XMPP服務器(比如ejabberd)和一個帶有nginx代理端口80的BOSH服務器到BOSH服務器(這樣你就可以在端口80上使用xmpp聊天協議,通過nginx和ejabberd, PHP方面)。然後問題是連接你的應用程序認證,識別等,這將通過擴展XMPP服務器配置來完成(例如,使用與你的PHP應用程序相同的LDAP服務器)。

您的第二個長輪詢問題是隊列的狀態。也許你可能會發現一些XMPP擴展。或者你可以在隊列上執行常規的ajax查詢。避免PHP應用程序發出大量Ajax請求的有用技術之一是根據斐波那契數字重新計劃檢查ajax回調的下一個ajax檢查(這是一個示例)。因此,下一次ajax電話會在第一時間安排在1分鐘後,下一次2分鐘,然後是3米,5米,8米,13米,21米,34米,55米,89米,144米等。這個想法是,檢查可能很重要新消息傳入頁面加載後1分鐘。由於用戶仍在閱讀相同的頁面(或者喝咖啡,與朋友交談,在不關閉電腦的情況下休假等),我們可以推遲越來越多的下一次檢查。是假設用戶不是真正活躍的方式。請注意,您可以通過其他方式檢測用戶活動並更改重新計劃。

-1

對於長時間投票,Comet和反向Ajax技術而言,PHP也不合適。你應該使用Node.js

+1

請給出一些原因,而不是一行回答。 – pascalhein

相關問題