Flock()

Résolu
cs_sidhannowe Messages postés 75 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 11 décembre 2007 - 12 janv. 2005 à 10:57
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 - 12 janv. 2005 à 18:20
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

cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008
12 janv. 2005 à 18:02
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
3
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
12 janv. 2005 à 11:50
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...
0
cs_sidhannowe Messages postés 75 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 11 décembre 2007
12 janv. 2005 à 12:15
Ok donc quoi que je fasse dans mon programme, PHP assure derrière qu'aucune donnée ne soit perdue ?
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
12 janv. 2005 à 12:25
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008
12 janv. 2005 à 14:17
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
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
12 janv. 2005 à 14:21
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
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
12 janv. 2005 à 18:06
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)
0
cs_sidhannowe Messages postés 75 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 11 décembre 2007
12 janv. 2005 à 18:16
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.
0
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008
12 janv. 2005 à 18:20
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
0
Rejoignez-nous