2010-05-17 6 views
3

Nous avons besoin d'accéder à un DB qui ne permet qu'une connexion à la fois. Cela me crie "singleton". La capture bien sûr est que la connexion singleton sera exposée (directement ou indirectement) via un service web (très probablement un service web basé sur SOAP - situé sur un serveur séparé de l'application (s) appelante) - ce qui signifie que il peut y avoir plus d'une application/instance essayant de se connecter à la classe singleton.Quelle est la meilleure façon de créer un WebService Singleton en PHP?

En PHP, quelle est la meilleure façon de créer un singleton global ou un singleton de service web?

TIA

+0

Par curiosité, êtes-vous autorisé à utiliser la connexion unique pour faire la réplication dans un magasin local? Si c'est le cas, vous pouvez vous intéresser à la réplication maître-maître. – Zak

Répondre

3

En PHP, il n'y a pas une telle chose comme un objet "global" qui se trouve sur toutes les demandes. Dans un serveur Web Java, cela s'appellerait "magasin de données au niveau de l'application". En php, l'étendue de la portée "globale" (en utilisant le mot-clé global) est une requête unique. Maintenant, il y a aussi un magasin de données inter-sessions accessible via $ _SESSION, mais j'essaie de souligner qu'aucune variable dans php n'est vraiment "globale". Les valeurs individuelles émulent étant globales en étant stockées dans un fichier local ou dans une base de données, mais pour quelque chose comme une ressource, vous êtes coincé en le créant à chaque requête. Maintenant, au niveau de la requête, vous pouvez créer un Singleton qui retournera une ressource initialisée quelle que soit la portée dans la requête à partir de laquelle vous l'appelez, mais encore une fois, cette ressource ne persistera pas entre les requêtes. Je sais, il est un défaut de PHP, mais d'autre part, la rapidité et la stabilité des demandes individuelles aident à combler cette lacune. Après avoir relu votre question, j'ai réalisé que vous ne demandez peut-être pas une classe d'accès à la base de données singleton, mais plutôt quelque chose qui peut verrouiller votre base de données. Sur la base de ce que vous avez dit, il semble que la base de données puisse faire le verrouillage pour vous de toute façon. En d'autres termes, il ne vous permettra pas de vous connecter s'il y a déjà une autre connexion. Si tel est le cas, il semble que vous ayez 2 options: 1) laissez toutes vos pages se disputer pour la ressource, et échouez si elles ne l'obtiennent pas.

2) Créez un service de file d'attente qui peut accepter les requêtes, les exécuter, puis mettre en cache les résultats pour votre récupération ultérieure.

+0

merci pour la note ... Comme mentionné ci-dessous, peut-être que nous devrons écrire un démon pour cela. Je suis surpris qu'il n'y ait pas de solutions tierces pour ce genre de chose ... – ChronoFish

+0

Merci Zak. Oui tu as raison. La base de données n'autorise qu'un seul accès à la fois. Nous avons discuté en utilisant une file d'attente et penchons de cette façon. Merci de renforcer l'idée. – ChronoFish

4

Cette cris "utilise un DB SERVEUR" pour moi. ;-), mais ...

Vous pouvez créer un SoapServer et utiliser un semaphore pour permettre seulement 1 connexion à la fois

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

// soapserver code here 

sem_release($s1); 
+0

En vous connectant à des applications tierces, vous dictez rarement l'architecture. Il est clair qu'un serveur de base de données correct est le chemin à parcourir lorsque cela est possible. Merci pour le rappel de sémaphore. Peut-être que nous devrons écrire un démon ..... – ChronoFish