2010-05-17 208 views
3

我們需要訪問一次只允許一個連接的數據庫。這叫我「單身」。當然,單身連接將通過Web服務(最可能的基於SOAP的Web服務 - 位於與調用應用程序不同的服務器上)暴露(直接或間接) - 這意味着可能有多個應用程序/實例試圖連接到單例類。在PHP中創建Singleton Webservice的最佳方式是什麼?

在PHP中,創建全局單例或Web服務單例的最佳方式是什麼?

TIA

+0

出於好奇,只有1個連接,你允許使用單一連接做複製到當地的商店?如果是這樣,你可以看看主 - 主複製。 – Zak 2010-06-01 18:17:05

回答

3

在PHP中,有沒有這樣的事情駐留在所有請求「全球」的對象。在一個java web服務器中,這將被稱爲「應用程序級數據存儲」。在PHP中,「全局」範圍的範圍(使用全局關鍵字)是一個請求。現在,還有一個可通過$ _SESSION訪問的跨會話數據存儲,但我試圖強調在php中沒有變量是真正的「全局」。單獨的值通過存儲到本地文件或數據庫來仿真爲全局的,但對於資源之類的東西,您堅持在每個請求上創建它。

現在,在請求級別,您可以創建一個Singleton,它會返回一個初始化的資源,無論您調用它的請求中的哪個範圍,但同樣,該資源不會持續存在於請求之間或存在於請求之間。我知道,它的的一個缺點,但另一方面,個別請求的速度和穩定性有助於彌補這個缺點。 編輯: 再次閱讀您的問題後,我意識到您可能不會要求單身數據庫訪問類,而是可以資源鎖定您的數據庫的東西?根據你的說法,這聽起來像數據庫可能會爲你鎖定。換句話說,如果已經有另一個連接,它將不允許你連接。如果是這樣的話,看起來好像有兩種選擇: 1)讓所有頁面爭奪資源,如果他們沒有得到它,就會失敗。

2)創建一個隊列服務,它可以接受查詢,運行它們,然後緩存結果給你,供以後檢索。

+0

感謝您的提示......如下所述,也許我們必須爲此編寫一個守護進程。我很驚訝這種事情沒有任何第三方解決方案... – ChronoFish 2010-05-18 03:52:08

+0

謝謝扎克。是的,你是對的。數據庫一次只允許單一訪問。我們已經討論過使用隊列並且正在傾向於這種方式。感謝您加強這個想法。 – ChronoFish 2010-05-18 19:04:06

4

這對我來說尖叫「使用DB 服務器」。 ;-),但...

您可以創建一個SoapServer的,並使用semaphore允許在同一時間

$s1 = sem_get(123, 1); 
sem_acquire($s1); 

// soapserver code here 

sem_release($s1); 
+0

當您登入第三方應用程序時,您很少會掌握體系結構。很明顯,一個合適的數據庫服務器是可行的方法。感謝信號量提醒。也許我們必須寫一個守護進程..... – ChronoFish 2010-05-18 03:49:32

相關問題