Écrire dans un fichier qui est en cours de lecture

Écrire dans un fichier qui est en cours de lecture - PHP - Programmation

Marsh Posté le 14-11-2017 à 10:12:23    

Bonjour,
 
La question : Est-ce gênant de modifier un fichier qui est lu par plusieurs centaines de visiteurs en même temps ?
 
Le contexte :  
Je peux potentiellement recevoir un trafic élevé sur une page (2 000 connectés). Celle-ci est mise en cache mais j'ai un graphique que je souhaite afficher en temps réel (enfin presque, il y a un différé de 5mn). Pour cela, j'utilise un fichier JSON (via parse en jquery) très léger que je mets à jour toutes les 5mn. Le fichier est modifié via PHP et je me demande donc s'il n'y a pas un risque de plantage car au moment où je vais recréer le fichier, il peut y avoir des centaines de personnes connectés qui consultent la page html qui elle-même lis le fichier JSON.
 
Merci d'avance pour vos réponses et bonne journée ;)


Message édité par kl14582 le 14-11-2017 à 19:31:11
Reply

Marsh Posté le 14-11-2017 à 10:12:23   

Reply

Marsh Posté le 14-11-2017 à 13:37:16    

Normalement, c'est au niveau de l'OS que les pbs d'accès concurrents sont gérés. Après, il me semble qu'il y a moyen, qu'on accès à un fichier de spécifier si on veut le locker ou pas.
A mon avis, je ne pense pas qu'il faille te préoccuper de ça...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 14-11-2017 à 14:07:39    

Bonjour Rufo et merci pour ta réponse.
 
Pour le lock, il y a bien la fonction flock() en php mais qui, semble-t-il s'utilise avec fopen. Dans mon cas, la lecture du fichier ne se fera pas en php mais via la fonction parse de Jquery donc j'imagine que Jquery ou JS ne peut pas détecter ce lock.
 
Sinon, j'avais pensé à quelque chose. Juste avant de modifier le fichier JSON, je duplique le fichier. Dans le JS, si le fichier dupliqué existe, je le lis, sinon je lis le fichier JSON d'origine. Ainsi, pendant l'écriture du fichier, le script utilise l'autre fichier.
 
Du coup, je ralenti un peu l'affichage du graphique du fait de tester l'existence du fichier dupliqué à chaque fois mais j'évite un éventuel plantage.
 
Qu'est-ce qui est le mieux ?

Reply

Marsh Posté le 14-11-2017 à 14:44:50    

Encore une fois, je pense pas que tu doives te préoccuper de ce pb bas niveau. Si ton javascript arrive à récupérer le fichier, c'est que l'OS côté serveur a autorisé cette opération. Côté PHP, tu lockes le fichier durant l'écriture. Cela dit, je doute que ça soit utile. L'option "c" de fopen qui permet d'avoir un verrou est arrivée fort tard dans les versions de PHP :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 14-11-2017 à 15:06:46    

Oui, je crois que tu as raison. C'est vrai que dans le JS, j'importe les données uniquement si le statut du fichier vaut 200 donc c'est que tout est ok à priori.  
 
Merci à toi pour ton aide Rufo !

Reply

Marsh Posté le 14-11-2017 à 15:46:36    

Le fait que les écritures et les lectures soient ou non atomiques dépend de ton système d'exploitation et des flags passés pour ouvrir le fichier.
 
Je pense donc que tu peux récupérer des données corrompues lorsque ton fichier est MAJ.

Reply

Marsh Posté le 14-11-2017 à 19:13:05    

Anonymouse a écrit :

Le fait que les écritures et les lectures soient ou non atomiques dépend de ton système d'exploitation et des flags passés pour ouvrir le fichier.
 
Je pense donc que tu peux récupérer des données corrompues lorsque ton fichier est MAJ.


 
Que me conseilles-tu dans mon cas ?
 
Pour résumer :  
OS : Linux
Modification d'un fichier via fopen en PHP (1 seule exécution / 5mn => tache cron)
Lecture du fichier via parse de Jquery (des centaines d'éxécutions / 5mn => internautes)

Reply

Marsh Posté le 14-11-2017 à 19:45:15    

kl14582 a écrit :


 
Que me conseilles-tu dans mon cas ?
 
Pour résumer :  
OS : Linux
Modification d'un fichier via fopen en PHP (1 seule exécution / 5mn => tache cron)
Lecture du fichier via parse de Jquery (des centaines d'éxécutions / 5mn => internautes)


 
Je dirais que:
-Tu peux détecter l'incohérence du fichier (Tu généres un checksum au début du fichier JSON sur le reste du fichier) et si le parsing du JSON échoue OU que le checksum n'est pas bon tu retente ta requête.
-Sinon tu génère le nouveau fichier JSON a coté de l'ancien et tu fais un rename du fichier ancien vers le nouveau, opération qui devrait être atomique sous linux.

Reply

Sujets relatifs:

Leave a Replay

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