Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1544 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Problème avec file_put_contents

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème avec file_put_contents

n°2120273
nisalon_ca​je
Posté le 09-01-2012 à 16:14:19  profilanswer
 

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
mood
Publicité
Posté le 09-01-2012 à 16:14:19  profilanswer
 

n°2120654
Pc_eXPert
Posté le 11-01-2012 à 02:01:49  profilanswer
 

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() ?

n°2157125
lpidery
Posté le 18-09-2012 à 16:20:36  profilanswer
 

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

n°2157557
czh
Posté le 21-09-2012 à 10:01:25  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Problème avec file_put_contents

 

Sujets relatifs
[C] problème de fichiersprobleme image en sortit de code
Problème boucle whileProblème avec Type défini par l'utilisateur...
[Resolu] probleme en C : comparaison de chaine de caractereProblème avec file_exists
Problème de lecture d'un fichier avec freadProblème de margin sur mon site
[résolu]Problème déploiement et routage heroku.[resolu] Problème API Google maps / file_get_contents disabled
Plus de sujets relatifs à : Problème avec file_put_contents


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR