dwogsi a écrit :
Si tu souhaites utiliser flock(), tu peux très bien lire et écrire le contenu de ton fichier XML avec les fonctions fopen(), fread(), fwrite() et fclose(). Il suffit d'utiliser simplexml_load_string() au lieu de la version *_file().
|
J'ai essayé ceci. Je me suis donc penché sur le fonctionnement de la fonction flock(). Le problème est que même l'exemple suivant (trouvé ici http://fr.php.net/manual/fr/function.flock.php) ne fonctionne pas :
Voici l'exemple en question
Code :
- <?php
- //1st script
- $file_handle = fopen('file.test', 'r+');
- flock($file_handle, LOCK_EX); //lock the file
- sleep(10); //sleep 10 seconds
- fclose($file_handle); //close and unlock the file
- ?>
- <?php
- //2nd script
- $file_handle = fopen('file.test', 'r+');
- flock($file_handle, LOCK_EX); //lock the file
- fclose($file_handle); //close and unlock the file
- ?>
|
Lorsque je lance dans des pages différentes les 2 scripts (le premier avant le second), et bien le second se termine immédiatement (un var_dump m'indique que le flock du second script retourne true)
dwogsi a écrit :
Tu peux également générer un fichier verrou. Par exemple, si ton fichier se nomme whatever.xml, ton script génère un fichier whatever.xml.lock. Il le supprime lorsqu'il a terminé son travail. Ainsi, il suffit de tester l'existence de ce fichier pour savoir si un autre script n'est pas déjà en train de travailler sur le fichier.
|
Je me suis donc dit que j'allais opté pour cette solution !
J'ai cependant un problème avec mon script
Le voici :
Code :
- <?php
- function simplexml_load_lock_file($file,$lock=true){
- // $file est l'adresse du fichier
- // $lock est un booléen permettant de savoir si l'on doit verrouiller le fichier
- // Adresse du fichier "verrou"
- $file_lock=$file.'.lock';
- // On attend que le fichier se délock (ceci est sauté si il est délocké lors de l'ouverture du fichier)
- $i=0;
- while(is_file($file_lock)){
- // On attends 10ms
- usleep(10*1000);
- $i++;
- // Si on a passé trop de temps en attente (15s), on arrete
- if($i>1500){
- return;
- }
- }
- // Quand on est arrivé ici, c'est que le fichier auquel on veut accéder est délocké
- if($lock){
- // On crée le fichier de lock
- $lock_file=fopen($file_lock,'a');
- fclose($lock_file);
- }
- $data=simplexml_load_file($file);
- return $data;
- }
- function simplexml_load_unlock_file($file){
- // $file est l'adresse du fichier
- $file_lock=$file.'.lock';
- @unlink($file_lock);
- }
- ?>
|
Et maintenant mes deux scripts de test (que je lance légèrement en décalé dans deux pages différentes) :
Celui que je lance en premier
Code :
- simplexml_load_lock_file('data.xml');
- sleep(10);
- simplexml_load_unlock_file('data.xml');
|
Celui que je lance en second
Code :
- var_dump(simplexml_load_lock_file('data.xml',false));
|
Et là je ne comprends pas. Le comportement que j'attends et que le deuxième script affiche le var_dump quasi au moment où le premier script se termine
Ce qui se passe dans les faits est que le deuxième script se termine bien après, du fait du
Code :
- if($i>1500){
- return;
- }
|
que j'ai mis là pour éviter un problème de boucle infinie ...
Et si je regarde avec mon client ftp pendant le script ce qui se passe, le fichier verrou apparait et disparait bien aux moments voulus ... il semblerait donc que ce soit lié à la fonction is_file qui rend un "faux positif"
Pourriez vous m'indiquer d'où viennent mes problèmes ?
Merci d'avance
PS : je suis chez OVH (sait-on jamais, cela concerne peut être leur système de fichier ...)
PPS : la version de php que j'utilise est la 5.2.13
Message édité par nisalon_caje le 21-07-2010 à 22:51:37