2011-05-12 28 views
3

我想知道是否有可能將xml文件更新從服務器推送到所有客戶端瀏覽器? 基本上我提出的情況是,我的服務器持有一個XML文件,當用戶加載一個頁面,使用所述XML文件,他們可以請求更改它,如果允許更改(由頁面客戶端確定),那麼XML文件是在服務器端更新。我很好,直到這一點(嗯,我有很多的閱讀讓我這一點)。然後,我希望所有連接的頁面刷新頁面中所有依賴於xml文件的元素,而無需刷新整個頁面。
換句話說,如果服務器上的副本比他們更新,那麼所有那些使用該文件更新副本 - >數據的頁面。這是可能通過服務器推,或者我必須不斷地輪詢服務器比較文件? (這似乎對我來說很sl .. ..)如果可能的話,最好的方法是什麼?將服務器上的xml文件更新推送到所有客戶端瀏覽器?

感謝您在正確的方向上的任何點。

回答

3

由於網頁是無狀態的,因此無法將數據推送到它。您需要輪詢服務器以獲取更新。考慮一下每5分鐘輪詢一次的小型ajax腳本,當內容更新時腳本會調用某些內容來更新頁面。你會需要很多Ajax來做到這一點;採取jQuery或類似的來實現這一點。

+0

感謝您的快速回復,是否有可能每隔幾秒輪詢一次服務器,還是會導致速度放慢? – tomatosource 2011-05-12 08:35:07

+0

不,您可以隨心所欲地抽出/輪詢,問題在於它是多麼有用,以及您是否有足夠的資源與用戶數量相比。如果你只有幾個用戶,每隔幾秒鐘輪詢一次都不會成爲問題。但是,如果你的用戶正在閱讀一篇文章,你想在閱讀文章時改變文章嗎?在後一種情況下,5分鐘更新會更合適。 – Prikkeldraad 2011-05-12 08:53:55

+0

你可能想看看[長期民意調查](http://en.wikipedia.org/wiki/Push_technology#Long_polling)。如果你有很多併發用戶(很多開放的連接),這並不完美。但即時迴應變化(如果這很重要)。 – Rudie 2011-05-12 10:05:41

0

您可以嘗試AJAX調用到一些PHP腳本,如:

set_time_limit(3600); // one hour or set it as long as your session timeout is 
// Keep on repeating this to prevent PHP from stopping the script 
while (true) 
{ 
    sleep(5); //5 seconds between polling the server 
    //do the updates xml updates 
    flush(); 
    ob_flush(); 
} 

連接將保持開放,並每5秒將XML拉和客戶端更新。

如果你不想花費大量的時間和資源,如果它沒有改變,你可以使用APC,memcache或任何其他服務器存儲的變量,通知你XML已更改。

if(apc_fetch('xml_updated') == 1) 
{ 
    //do the xml pull 
} 

您可以測試一下,如果您試圖在資源方面每秒提取數據,會發生什麼情況。在我看來,最好有一個更大的延遲。

希望它有幫助!

+1

只是一邊不,這不是推,而是拉。推送將從服務器到客戶端,服務器不知道它的客戶端(沒有開放的套接字,也沒有人在遠程端口上監聽),所以它不能推送。它只能由客戶端從服務器拉到客戶端。 – Prikkeldraad 2011-05-12 08:51:36

+0

@Prikkeldraad的確如此。我做了更新。乾杯! – 2011-05-12 09:48:16

相關問題