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 :

Exclusion mutuelle d'accès à une page


Sujet :

Langage PHP

  1. #1
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut Exclusion mutuelle d'accès à une page
    Bonjour,

    Dans une application web j'ai une page qui fait un traitement sur des fichiers.
    J'aimerai éviter que plusieurs utilisateurs puissent accéder à cette page
    simultanément. (sinon ça risque de poser des problèmes avec ces fichiers)

    Pensez-vous que les sémaphores, via les fonctions
    sem_get, sem_acquire et sem_release soient adaptés pour ça ?

    où avez-vous d'autre propositions ?

    merci.
    Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !

  2. #2
    FoxLeRenard
    Invité(e)
    Par défaut
    Citation Envoyé par marcha Voir le message
    Bonjour,
    Dans une application web j'ai une page qui fait un traitement sur des fichiers.
    J'aimerai éviter que plusieurs utilisateurs puissent accéder à cette page
    simultanément. (sinon ça risque de poser des problèmes avec ces fichiers)
    Pensez-vous que les sémaphores, via les fonctions
    sem_get, sem_acquire et sem_release soient adaptés pour ça ?
    où avez-vous d'autre propositions ?
    merci.
    salut, moi j'ais tendance a gerer ça dans mon coin, c'est pour cela que j'ais sur tout mes WEB, une table Mysql "flag"

    Un index auto incremente juste pour leplaisir
    Une zone alpha qui s'appelle Flag_quelquechose
    (par exemple dans ton cas on dirait Flag_traite_actif)
    contenant O/N

    alors comme ça c'est enfantin, le visiteur veut lancer ton traitement, tu lis
    Flag_traite_actif Si elle est a N
    tu la mets a O et tu lance le traitement
    Si elle est a O tu lui mets ungentil message En Cours ....

    Bien sur en fin de traitement tu déflague

  3. #3
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Salut,

    merci pour ta réponse. c'est une possibilité. mais j'aimerai bien savoir
    si quelqu'un utilise les sémaphore de php pour ça.
    Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 22
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    Les sémaphores de php ne me semblent pas adaptés pour cet usage, parce que sem_acquire() est bloquant. Du coup, si un process a pris le sémaphore, le process suivant qui essaiera de le prendre sera mis en sommeil jusqu'à la libération du sémaphore. On ne pourra donc pas avertir le 2ème utilisateur que la ressource est occupée, tout ce qu'il verra, c'est une page blanche et un sablier.

    Moi, je résouds le problème avec un fichier qui me sert de sémaphore.

    A+

    Richard.

  5. #5
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Merci pour ta réponse.

    Dans mon cas le temps de traitement est relativement court et la probabilité
    que deux utilisateurs accèdent en même temps est faible.

    Mais si tu as un exemple avec le fichier, c'est volontiers
    Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 22
    Points : 28
    Points
    28
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (file_exists(".lock")) {
        // la ressource est occupée: attendre ou afficher un message...
    }
    else {
        // la ressource est libre
        @touch(".lock"); // verrouiller
        // faire le traitement ...
        @unlink(".lock"); // libérer
    }

  7. #7
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Salut, merci.

    Je veux pas faire le parano :-) mais c'est pas thread safe, il est possible
    qu'un premier processus traite if (file_exists(".lock")) puis perde la main
    et qu'un deuxième fasse le touch (donc entre dans la zone 'protégée'
    puis perde la main, et que l'autre processus qui reprend la main entre en
    même temps dans la zone protégée.

    Qu'en penses-tu ?

    EDIT: et si il y a une erreur fatale en cours de traitement, le fichier subsiste
    et plus personne peut travailler.
    Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 22
    Points : 28
    Points
    28
    Par défaut
    > Qu'en penses-tu ?

    Tu as raison. Une meilleure solution serait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $fh = fopen(".lock", "x"); // créer et ouvrir le fichier ou retourner FALSE si il exite deja
    if ($fh === FALSE) {
        // la ressource est occupée: attendre ou afficher un message...
    }
    else {
        // la ressource est libre
        // faire le traitement ...
        fclose($fh);
        unlink(".lock"); // libérer
    }
    >si il y a une erreur fatale en cours de traitement, le fichier subsiste
    et plus personne peut travailler.


    On pourra éviter ce problème ainsi: si le fopen() échoue parce que le fichier existe, alors on détermine l'âge du fichier; si il est nettement supérieur à la durée maximum du traitement, on considère que la ressource est libre.

    A+

  9. #9
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Salut,

    merci pour ta réponse, je vais implémenter ça.
    Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !

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

Discussions similaires

  1. [Cookies] Pas plus d'un accès à une page?
    Par Davidabroad dans le forum Langage
    Réponses: 5
    Dernier message: 04/10/2006, 22h46
  2. Réponses: 4
    Dernier message: 28/09/2006, 13h37
  3. [MySQL] PB pour l'acces à une page
    Par lolodelp dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 04/07/2006, 11h27
  4. [Reseau] Accés à une page interne
    Par vincedjs dans le forum Apache
    Réponses: 4
    Dernier message: 02/02/2006, 10h20
  5. Bloquer l'accès à une page en fonction du navigateur
    Par 10-nice dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 30/08/2005, 15h29

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