|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre actif
![]() Inscription : juillet 2004 Messages : 277 ![]() |
J'ai un ensemble de webservices utilisés avec la librairie NuSoap.
Ces webservices doivent être appelés dans un certain ordre pour un utilisateur distant. C'est à dire qu'il y a un séquencement d'actions (d'appels de méthodes) et que l'utilisateur ne doit en aucun cas pouvoir appeler 2 webservices en même temps. J'aimerais, pour éviter ces appels simultanés et concurrents, mettre un place un système d'attente afin que le premier appel soit bien terminé avant que l'autre se lance. Pour ce faire, j'ai pensé à un système de sémaphore ou de mutex, comme on fait en langage C. Et là, a mon grand désarroi, je m'aperçois que php est bien mal armé pour ce genre de choses. D'une part, les sémaphore ne sont disponible que sous les Système V, d'autre part, il faut recompiler le tout, ce qui dans mon cas n'est pas concevable. J'ai besoin donc d'une restriction par session php, pour ne pas qu'il y ait des appels concurrents aux webservices. J'ai pensé pour cela, utiliser une variable de session "monSemaphore" que je mettrai à 0 ou à 1 si un appel est en cours. Dans le cas ou il y a déjà un appel en cours, je pourrai faire boucler sur un sleep() ou wait() pour tester à intervalle régulier la disponibilité de mon sémaphore. Bien sur, je mettrai aussi un timeout pour éviter tout deadlock. Mon problème est le suivant : je ne suis pas certain que la lecture ou l'écriture dans une variable de session soit atomique ou protégée (thread safe). Donc ma question est : est-ce que la lecture d'une variable de session php est atomique ou "thread safe"? Ou est-ce que cela n'est pas du tout prévu dans php? Merci beaucoup!
__________________
Хајде Јано коло да играмо |
|
|
00
|
|
|
#2 |
|
Membre régulier
![]() Inscription : juin 2007 Messages : 89 ![]() |
Bonjour, as tu vraiment besoin d'avoir une boucle d'attente sur la deuxième requête le temps de recevoir la première? Le plus simple serait un code de retour genre "503 : service non disponible" et à charge au client d'effectuer les requêtes dans le bon ordre.
Sinon tu ne vas pas pouvoir utiliser les sessions, car lorsque tu récupères les variables de ta session et que tu te mets en attente (sleep par exemple) la modification de la session par une autre requêtes n'est pas automatique répercuté sur ton script en cours. Le seul moyen serait de fermer ta session et la réouvrire à chaque fois, enfin pas très propre. Un meilleur moyen serait de stocker l'état d'avancement dans une base de données. |
|
|
00
|
|
|
#3 |
![]() ![]() Inscription : août 2006 Messages : 1 207 ![]() |
+1
Dans la "vue" d'un script php entrain de s'executer, tu n'as pas d'info sur les script qui s'éxécutent en paralèlle, donc pas moyen de connaitre leur état (en d'autres terme, il n'existe pas de variable completement globale, partagée par tous les scripts php en cours d'excution). Le seul moyen a ma connaissance est donc, depuis un script de poser ton info "ailleur", que ce soit dans une base de donnée ou un fichier.
__________________
Rakken Oneira, un monde imaginaire d'Heroic Fantasy. Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/ |
|
00
|
|
|
#4 |
|
Membre actif
![]() Inscription : juillet 2004 Messages : 277 ![]() |
En fait, mes sessions sont stockées en base de données.
Donc c'est comme ça que je pensais utiliser une variable de session pour savoir ou j'en suis. Mon problème, c'est que ma lecture et mon écriture en base ne sont, je pense, pas atomiques du tout. Merci pour les contributions, ça confirme un peu ce que je pensais. Je fais avancer le schmilblick.
__________________
Хајде Јано коло да играмо |
|
|
00
|
|
|
#5 |
|
Membre régulier
![]() Inscription : juin 2007 Messages : 89 ![]() |
Par contre que tes sessions soient stoquées dans une base de données ou un fichier ne résoud pas le problème, puisque tes variables de sessions sont récupérées au début du script, donc impossible en l'état de savoir si elles sont modifiées par une autre requête.
Le mieux serait que tu passe par une table spécial,tu y stocke l'identifiant de la session et l'état d'avancement, ensuite tu n'as plus qu'à vérifier à interval régulier dans ta table. La à moins tu aura ton atomicité (pour la corruption de données). |
|
|
00
|
|
|
#6 | |
|
Membre actif
![]() Inscription : juillet 2004 Messages : 277 ![]() |
Citation:
D'autre part, ce que je vais faire pour éviter d'utiliser une transaction ou un lock, c'est que je vais utiliser une requête qui gère à la fois la mise à jour de mon état et qui lit en même temps ce même état. Ainsi, je pourrais faire quelque chose du style : Code SQL :
UPDATE semaphore SET sem=1 WHERE sem=0 AND session = maSession Ok, vendu! Merci beaucoup à tous pour votre aide!
__________________
Хајде Јано коло да играмо |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com