Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
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 05/01/2007, 12h33   #1
Invité de passage
 
Inscription : septembre 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 15
Points : 1
Points : 1
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 :
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 ?
malag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2007, 12h44   #2
Invité régulier
 
Inscription : janvier 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 13
Points : 7
Points : 7
Au lieu du if, il sufffit de mettre un while ! Par exemple :

Code :
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);
 
?>
rocchr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2007, 12h52   #3
Invité de passage
 
Inscription : septembre 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 15
Points : 1
Points : 1
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.
malag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2007, 13h00   #4
Invité régulier
 
Inscription : janvier 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 13
Points : 7
Points : 7
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...
rocchr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2007, 13h01   #5
Invité régulier
 
Inscription : janvier 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 13
Points : 7
Points : 7
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.
rocchr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2007, 13h10   #6
Invité régulier
 
Inscription : janvier 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 13
Points : 7
Points : 7
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 !
rocchr est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h30.


 
 
 
 
Partenaires

Hébergement Web