2011-03-27 3 views
5

J'ai eu un nouveau venu (l'adolescent d'à côté) écrire du code php pour suivre un peu d'utilisation sur mon site web. Je ne suis pas familier avec php, donc je demande un peu d'accès aux fichiers concurrents.fichier de verrouillage en php

Mon application native (sous Windows) enregistre parfois des données sur mon site en tapant l'URL contenant mon script PHP. L'application native n'examine pas les données renvoyées.

 $fh = fopen($updateFile, 'a') or die("can't open file"); 
     fwrite($fh, $ip); 
     fwrite($fh, ', '); 
     fwrite($fh, $date); 
     fwrite($fh, ', '); 
     fwrite($fh, implode(', ', $_GET)); 
     fwrite($fh, "\r\n"); 
     fclose($fh); 

Ceci est un site à faible trafic et les données ne sont pas critiques. Mais que se passe-t-il si deux utilisateurs entrent en collision et que deux instances du script essaient chacune d'ajouter une ligne au fichier? Existe-t-il un verrouillage de fichier implicite en php?

Le code ci-dessus est-il au moins sûr de ne pas être verrouillé et de ne jamais retourner le contrôle à mon utilisateur? Le fichier peut-il être corrompu? Si j'ai le script ci-dessus supprimer le fichier tous les mois, que se passe-t-il si une autre instance du script est en cours d'écriture dans le fichier?

Répondre

9

Vous devez mettre un verrou sur le fichier:

<?php 
$fp = fopen($updateFile, 'w+'); 
if(flock($fp, LOCK_EX)) { 
fwrite($fp, 'a'); 
flock($fp, LOCK_UN); 
} else { 
echo 'can\'t lock'; 
} 

fclose($fp); 
+0

Exactement ce que je cherchais, Raymond. Merci. D'après d'autres lectures que je viens de faire (http://www.tuxradar.com/practicalphp/8/11/0), il semble que l'instruction echo pourrait ne jamais être atteinte. Un second processus ne bloquera-t-il pas l'appel de troupeau avant que le fichier ne soit déverrouillé par un premier processus? Le troupeau n'a-t-il pas besoin d'un OR LOCK_NB pour que l'instruction d'écho puisse être atteinte? – RobertFrank

+0

J'avais espéré obtenir une réponse de M. Ho ou de quelqu'un d'autre ici pour savoir si mon observation que l'écho-déclaration ci-dessus serait atteint ou non. – RobertFrank

+4

Oui, vous avez besoin d'un '| LOCK_NB' dans le code, sinon le verrou se verrouillerait s'il était déjà verrouillé :) – cweiske

3

Depuis c'est un ajout au fichier, la meilleure façon serait de regrouper les données et l'écrire dans le fichier dans un fwrite(), fournir les données à écrire n'est pas plus grand que le tampon de fichier. Bien sûr, vous ne connaissez pas toujours la taille du tampon, donc flock(); est toujours une bonne option.

+0

Je ferais les deux: garder l'écriture à un seul 'fwrite()' * et * verrouiller le fichier. Sur certaines plateformes Linux et certains systèmes de fichiers plus anciens, 'flock()' ne verrouille peut-être pas le fichier. – Jason

Questions connexes