2012-07-26 20 views
0

我有捕獲在一個數據庫表中的某些事件基於PHP的Web應用程序。它還具有這些捕獲事件的可視化:一個列出由ajax控制的事件的html表。進程間推捕獲的事件

我想添加一個可選的「活」的功能:按下一個按鈕(「開啓」)的那刻起將被插入到已經可見表捕獲的所有事件之後。有三件事情必須發生:注意事件,獲取事件數據並將其插入表中。爲了讓服務器負載保持在合理範圍內,我不想用ajax請求輪詢新事件,而是我更喜歡長輪詢策略。

的問題,這顯然是做一個長輪詢Ajax調用時服務器相對人有監視的事件。由於事件是通過PHP腳本註冊的,因此沒有簡單的方法可以注意到該事件,而無需再次輪詢數據庫以進行更改。這是因爲捕獲操作在另一個進程中運行,而不是觀察長輪詢請求。我環顧四周尋找一種可用於這種進程間通信的機制,就像我從Linux下的胖客戶端那裏瞭解到的那樣。事實上,PHP擴展了信號量,共享內存甚至是posix。但是他們都只存在於linux(或unix like)系統下。儘管通常情況下該應用程序可能會在極少數情況下在MS-Windows系統下使用。

所以我簡單的問題是:是否有這通常是對所有(大多數)系統,可以推動這樣的事件PHP腳本服務長輪詢Ajax請求任何可用的手段?因爲我在其他地方已經有了一個事件,所以不經常查詢文件或數據庫?

回答

0

所以,最初的警告:沒有做一些「特殊」,試圖做長輪詢香草PHP,直到你殺你的服務器會吃資源。

這裏是一個很好的基本指南基本基於PHP的長輪詢和一些與去「簡單」的道路相關的挑戰: How do I implement basic "Long Polling"?

至於這樣做的真正的跨平臺(和簡單的足夠開始),您可能需要回到某種簡單的內部投票 - 但目標應該是確保此操作比客戶投票的成本低得多。

其中一條路線將基本上像對待數據庫調用(此時您正在進行數據庫調用)一樣進行處理,並使用一些標準緩存方法。從APC一切,memcached的,輪詢一個文件,將所有可能少放負載在服務器上不是讓客戶建立和拆除連接每一秒。讓一個進程將數據放在正確的鍵中,然後定期在腳本中輪詢它們。

下面是各種緩存選項可能是跨平臺夠你一個很好的概述: http://simas.posterous.com/php-data-caching-techniques

一旦你達到了這種方法的限制,你可能必須移動到不同的服務器無論如何。