2010-05-17 137 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

相关问题