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 :

Verrou en écriture


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 16
    Par défaut Verrou en écriture
    Bonjour,

    Je réalise un petit chat, où j'utilise un fichier pour stocker les messages des utilisateurs. Dans mon script pour ajouter des messages il faut donc que je m'assure que plusieurs utlisateurs en peuvent pas écrire en même temps dans le fichier.

    En cherchant sur le net j'ai trouvé ce petit bout de code qui permet de vérouiller un fichier en écriture.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    <?php
     
    $fp = fopen("/tmp/lock.txt", "w+");
     
    if (flock($fp, LOCK_EX)) { // pose un verrou exclusif
        fwrite($fp, "Ecrire dans le fichier\n");
        flock($fp, LOCK_UN); // libère le verrou
    } else {
        echo "Impossible de verrouiller le fichier!";
    }
     
    fclose($fp);
     
    ?>
    Mon souci c'est de savoir, si cette fonction flock utilise un système de file d'attente, ou si le fichier est vérouillé est ce qu'il n'attend pas qu'il soit dévérouillé et n'inscrira donc pas le message de l'utilisateur dans le tchat.

    Si ce n'est pas le cas comment pourrais je faire un système de file d'attente pour attendre que le fichier soit dévérouillé pour écrire dedans ?

  2. #2
    Membre habitué
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut
    Au lieu du if, il sufffit de mettre un while ! Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
     
    $fp = fopen("/tmp/lock.txt", "w+");
     
    while (!flock($fp, LOCK_EX)); // attend que le fichier puisse être bloqué
     
    fwrite($fp, "Ecrire dans le fichier\n");
    flock($fp, LOCK_UN); // libère le verrou
     
    fclose($fp);
     
    ?>

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 16
    Par défaut
    Donc flock ne gère pas de file d'attentes.

    J'avais aussi pensé à ta solution que tu viens de de donner. Néanmoins y a quand même un petit souci. Avec ce système s'il y a 10 ou 15 utlisateurs qui sont en train de boucler pour savoir s'ils peuvent lire le message, l'ordre dans lequel les messages sont arrivés risquent de n'être pas bon. J'aimerai avoir un vrai système de file d'attente, où le prermier arrivé est le premier servi.

  4. #4
    Membre habitué
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut
    Dans ce cas, je ne vois pas comment faire, puisque par définition internet est asynchrone. On ne sait pas justement dans quel ordre doivent arriver les messages qui sont sujets aux aléas des routeurs...!!!

    Par contre, pour un internaute donné, il est possible de suivre un ordre qu'on se fixe en trackant l'internaute. Mais cela, il faut que tu le gères toi-même...

  5. #5
    Membre habitué
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut
    Citation Envoyé par malag
    Avec ce système s'il y a 10 ou 15 utlisateurs qui sont en train de boucler pour savoir s'ils peuvent lire le message, l'ordre dans lequel les messages sont arrivés risquent de n'être pas bon...
    Je ne comprends pas ta logique de lecture et d'écriture. Le mieux serait de dire exactement ce que tu veux faire.

  6. #6
    Membre habitué
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut
    En clair, imaginons qu'un internaute est en train d'écrire dans le chat, les autres sont par définition en attente de lecture ou d'écriture. Donc pas de pb !
    Dès que celui qui est en train d'écrire libère le lock, c'est n'importe quel autre user qui essaye d'écrire et c'est là ton pb, d'après ce que je comprends.

    Or le temps de blocage pour une écriture est tellement faible que cela ne devrait pas jouer pour que les messages s'enchevêtrent comme tu le penses. Et si jamais cela arrivait, les users n'y verraient que du feu !!! C'est comme si l'un avait écrit avant l'autre, mais dans un chat, cela arrive tout le temps... Il y en a toujours qui répondent plus vite que les autres !!!

    Donc à mon avis, pas de pb !

Discussions similaires

  1. La mauvaise écriture nuit gravement aux performances
    Par Blustuff dans le forum OpenGL
    Réponses: 6
    Dernier message: 25/05/2004, 13h08
  2. droits en écriture sur le réseau
    Par julien20vt dans le forum MFC
    Réponses: 4
    Dernier message: 25/03/2004, 11h29
  3. [DOM] création et écriture
    Par phoebe dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 22/03/2004, 15h13
  4. [debugger] détection écriture mémoire
    Par tut dans le forum MFC
    Réponses: 3
    Dernier message: 07/01/2004, 10h17
  5. [Kylix] Simplifications de l'écriture Kylix/Pascal"
    Par Mr Vincent KLEIN dans le forum EDI
    Réponses: 1
    Dernier message: 11/03/2003, 11h07

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