Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/07/2007, 16h36   #1
Membre actif
 
Inscription : juillet 2004
Messages : 277
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 277
Points : 166
Points : 166
Par défaut Sémaphores maison et atomicité

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!
__________________
Хајде Јано коло да играмо
SuperCed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 18h17   #2
Membre régulier
 
Inscription : juin 2007
Messages : 89
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2007
Messages : 89
Points : 95
Points : 95
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.
dewsz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 18h28   #3
Modérateur
 
Avatar de Rakken
 
Inscription : août 2006
Messages : 1 207
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 207
Points : 1 137
Points : 1 137
+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/
Rakken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 18h36   #4
Membre actif
 
Inscription : juillet 2004
Messages : 277
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 277
Points : 166
Points : 166
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.
__________________
Хајде Јано коло да играмо
SuperCed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 18h58   #5
Membre régulier
 
Inscription : juin 2007
Messages : 89
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2007
Messages : 89
Points : 95
Points : 95
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).
dewsz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 19h19   #6
Membre actif
 
Inscription : juillet 2004
Messages : 277
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 277
Points : 166
Points : 166
Citation:
Envoyé par dewsz
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).
Tu as raison.
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
Je teste ensuite le nombre de lignes affectées par la requête, j'aurai ainsi l'état.

Ok, vendu!

Merci beaucoup à tous pour votre aide!
__________________
Хајде Јано коло да играмо
SuperCed est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h12.


 
 
 
 
Partenaires

Hébergement Web