Flock()

Résolu
Signaler
Messages postés
75
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
11 décembre 2007
-
Messages postés
1662
Date d'inscription
lundi 16 septembre 2002
Statut
Membre
Dernière intervention
30 juillet 2008
-
Salut,

Je développe un script se servant de fichiers texte pour stocker des données. Le problème est que si 2 script accède en meme temps au meme fichier, il risque d'y avoir perte de données ? Dois-je alors utiliser la fonction flock() ?

Merci pour vos réponses

9 réponses

Messages postés
1662
Date d'inscription
lundi 16 septembre 2002
Statut
Membre
Dernière intervention
30 juillet 2008
1
Tu te trompes... le lock des fichiers dépend bien des systèmes
d'exploitation... donc il se pourait dans la vie de tous les jours
qu'un système d'exploitation ne supporte pas le lock.

En php, si tu ne lock pas, un fichier peut très bien être accedé en lecture ET/OU écriture !!!

Essais ceci :

a.php

<?php

$fp = fopen('test.txt','a+');

fwrite($fp,'salut1'."\n");

sleep(15);

fwrite($fp,'rien1'."\n");

fclose($fp);

?>



b.php

<?php

$fp = fopen('test.txt','a+');

fwrite($fp,'salut2'."\n");

sleep(15);

fwrite($fp,'rien2'."\n");

fclose($fp);

?>



Fait fonctionner a.php et ensuite (avant 15 secondes), b.php



Ton fichier test.txt contiendra ceci :

salut1

salut2

rien1

rien2





Surpris ? (Test avec apache1 ou apache2... le résultat sera le même)

Donc peut importe les threads ou pas... Le fichier n'est pas bloqué !
C'est pourquoi si tu veux VRAIMENT bloquer ton fichier tu dois utiliser
flock ou, tu arrêtes d'utiliser les fichiers et tu passes à base de
données :P

PHP Guru
Écoutez les conseils d'un vieux sage ! Ils sont souvent très utiles.
http://www.lookstrike.com
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
17
Un fichier ne peut pas être ouvert en écriture par deux programmes en
même temps, c'est une question de concurrence. Il peut y avoir milles
lecteurs simultanés (même pendant une écriture) mais un seul qui
écrit...
Messages postés
75
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
11 décembre 2007

Ok donc quoi que je fasse dans mon programme, PHP assure derrière qu'aucune donnée ne soit perdue ?
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
17
Je suis pas un spécialiste php, mais je crois qu'en principe les
scripts sont exécutés un à un, une requête à la fois et il n'y a donc
pas à s'inquiéter de la concurrence.
Messages postés
1662
Date d'inscription
lundi 16 septembre 2002
Statut
Membre
Dernière intervention
30 juillet 2008
1
Quoi faire ?

- passer à les bases de données...

- Utiliser flock()...



malik, depuis Apache2, le serveur gère les requêtes avec des threads... plusieurs scripts peuvent fonctionner en même temps !

PHP Guru
Écoutez les conseils d'un vieux sage ! Ils sont souvent très utiles.
http://www.lookstrike.com
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
17
Salut GRenard, merci pour l'info.



Ceci dit, ça n'empêche normalement pas qu'un fichier ouvert en écriture
par un process ne peut l'être par un autre non? C'est un principe de
base en concurrence et systèmes d'exploitation et ça m'étonnerait un
peu que PHP ou Apache échappent à cette règle... ou je me trompe? T'as
un contre-exemple si je me trompe?



Thanx, Malik7934
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
17
Je trouve ça totalement incroyable! Alors qu'on nous a rabattu aux
cours de systèmes d'exploitation qu'on ne peut faire W/W, tu me montres
le contraire !!!

J'aurais appris quelque chose today ;o)
Messages postés
75
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
11 décembre 2007

Merci pour ta réponse renard, si je n'utilise pas de bdd c'est que y'a bien une raison ;-)

Mon script pouvant être amené à subir beaucoup d'appels en peu de temps, il faut que j'utilise flock lors d'opération d'écriture.
Messages postés
1662
Date d'inscription
lundi 16 septembre 2002
Statut
Membre
Dernière intervention
30 juillet 2008
1
Choisi réponse acceptée pour celles qui t'interessent !

Il y a
pleins de systèmes d'exploitation qu'y n'ont pas le système e lock
(donc flock ne marcherait pas, mais php doit l'émuler au pire)

Mais du lock comme je dis, il y a des systèmes qu'y ne le font pas !
comme par exemple le système d'exploitation TiniOs qui fonctionne sur
de super machine à dual processor 18Mhz :P ne le fait pas (ca ctait
notre cours :P)




PHP Guru
Écoutez les conseils d'un vieux sage ! Ils sont souvent très utiles.
http://www.lookstrike.com