Problème avec file_put_contents

Problème avec file_put_contents - PHP - Programmation

Marsh Posté le 09-01-2012 à 16:14:19    

Bonjour

 

J'ai un petit soucis avec la fonction file_put_contents.

 

Je m'explique :
Voici un code :

Code :
  1. $data = array('a'=>rand(),'b'=>rand(),'c'=>rand());
  2. file_put_contents($filename,json_encode($data), LOCK_EX);
 


Ce qui se passe, c'est que parfois (relativement rarement néanmoins), ce qui est écrit dans le fichier n'est pas correct (typiquement j'ai deux accolades fermantes, comme si le contenu précédent n'était pas effacé)
J'ai pensé à un problème d'écritures simultanées, mais le problème est que ce fichier ne peut être écrit que par cette fonction et que cette fonction ne peut être appelée deux fois en même temps. (néanmoins je peux avoir une lecture (via une fonction appelée par un autre client) et une écriture via cette fonction en simultané)

 

Auriez vous une idée du problème (ou de comment le résoudre ?)

 

Merci d'avance !

 


EDIT :

 

Je n'ai toujours pas résolu le problème

 

Après quelques tests, j'ai néanmoins remarqué le soucis suivant :
Voilà deux scripts php queje fais tourner en même temps :

Code :
  1. <?php
  2. // Fichier "ecriture.php"
  3. set_time_limit(0);
  4. ignore_user_abort(true);
  5. $filename = 'test.json';
  6. $puiss = array();
  7. for($i=0;$i<10;$i++){
  8. $puiss[$i]=pow(10,$i+1);
  9. }
  10. for ($i = 0; $i < 100000; $i++) {
  11.     $data = array('a' => (mt_rand()%$puiss[rand()%10]), 'b' => (mt_rand()%$puiss[rand()%10]), 'c' => (mt_rand()%$puiss[rand()%10]));
  12.     file_put_contents($filename, json_encode($data), LOCK_EX);
  13. }
  14. echo 'fini';
  15. ?>
 
Code :
  1. <?php
  2. // Fichier lecture.php
  3. set_time_limit(0);
  4. ignore_user_abort(true);
  5. $filename = 'test.json';
  6. for ($i = 0; $i < 1000000; $i++) {
  7.     $data = file_get_contents($filename);
  8.     if (json_decode($data, true) == false) {
  9.         echo 'Erreur !! - "'.$data.'"';
  10.         break;
  11.     }
  12. }
  13. echo 'fini';
  14. ?>
 

Donc je fais tourner les deux en même temps et le script lecture et le script lecture s'arrête quasi immédiatement, me montrant la chaine de caractère vide ...
Alors que selon moi, le LOCK_EX aurait du empêcher cela !

 

EDIT EDIT : en rajoutant : " && strlen($data)!=0) et en faisant tourner ces deux scripts en parallèle, j'ai obtenu

Code :
  1. {"a":71395911,"b":8808,"c":17}6}

, ce code permet donc de reproduire le bug


Message édité par nisalon_caje le 10-01-2012 à 23:56:16
Reply

Marsh Posté le 09-01-2012 à 16:14:19   

Reply

Marsh Posté le 11-01-2012 à 02:01:49    

Tu es sûr que tu veux file_put_contents et file_get_contents dans des loupes ?
Étant donné que la fonction file_get_contents rappatrie l'intégralité du fichier, ce n'est pas nécessaire. Peut-être pensais-tu utiliser fread() ?

Reply

Marsh Posté le 18-09-2012 à 16:20:36    

Slt, j'ai le même problème avec un de mes site. Le bug arrive assez rarement. quelqu'un a une solution ?

Reply

Marsh Posté le 21-09-2012 à 10:01:25    

Dans le script qui lit, le file_get_contents ne va pas vérifier le lock automatiquement. Il faut utiliser une fonction comme [celle-ci http://php.net/manual/fr/function.flock.php#74155 ] pour checker le lock avant lecture.


Message édité par czh le 21-09-2012 à 10:01:40
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed