IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Sémaphores maison et atomicité


Sujet :

Langage PHP

  1. #1
    Membre actif
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Points : 291
    Points
    291
    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!

  2. #2
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2007
    Messages : 89
    Points : 99
    Points
    99
    Par défaut
    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.

  3. #3
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    +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.

  4. #4
    Membre actif
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Points : 291
    Points
    291
    Par défaut
    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.

  5. #5
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2007
    Messages : 89
    Points : 99
    Points
    99
    Par défaut
    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).

  6. #6
    Membre actif
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Points : 291
    Points
    291
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. package fait maison
    Par kij dans le forum Modules
    Réponses: 6
    Dernier message: 20/04/2005, 17h57
  2. recherche de logiciel de conception de maison
    Par starway dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 24/02/2005, 11h40
  3. Processus et sémaphores
    Par slim dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 14/05/2004, 23h27
  4. serveur d'impression "maison"
    Par Eusebius dans le forum Développement
    Réponses: 2
    Dernier message: 29/08/2003, 22h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo