2010-09-30 1 views
1

Je travaille sur une application Web PHP qui redimensionne automatiquement les images et je pense à stocker les copies mises en cache sur le NAS monté sur NFS afin que je puisse facilement vider le cache lorsque les images sont mises à jour. La seule chose qui m'inquiète est ce qui se passe en général avec NFS si 2 serveurs ou plus du cluster essaient de créer le même fichier de cache d'image en même temps? Il y a de bonnes chances que lorsque le cache est vidé pour les mises à jour de contenu qu'ils pourraient entrer en collision comme ça, mais je n'ai pas un excellent moyen de tester ce scénario en développement parce que je ne travaille que sur une seule case .Que se passe-t-il dans NFS si 2 serveurs ou plus essaient d'écrire le même fichier simultanément?

Toute personne ayant de l'expérience à ce sujet?

+1

Peut-être mieux de demander sur http://serverfault.com/. – tplaner

+0

Je n'avais pas encore rencontré serverfault.com alors merci de l'avoir signalé. Cela ressemble à une ressource géniale que je vais utiliser à l'avenir, mais je pense que steven_desu a pris soin de moi en dessous de toute façon. – user126715

Répondre

3

Cela dépend de la façon dont vous ouvrez le fichier. Si vous ouvrez le fichier en mode "append" alors Unix/Linux écrira le contenu dans un cache jusqu'à ce que vous créiez un caractère de nouvelle ligne, puis il colle la nouvelle ligne à la fin du fichier (écraser le " "byte pattern" de fin de fichier) et écrit une nouvelle "fin de fichier". Dans ce cas, si deux personnes essayent d'écrire simultanément dans le même fichier, les deux lignes d'écriture passeront, se fixant une ligne à la fois dans l'ordre où elles ont été reçues. Ainsi, vous pouvez vous attendre quelque chose comme:

This was the old contents 
of the file 
The first script added 
The second script added 
this line (script 1) 
this line (script 2) 

Dans la chance rare que deux commandes « d'écriture » arrivent à la même heure (jusqu'à la précision de la nanoseconde), le système d'exploitation crée en fait un état d'interruption. C'est à l'OS de gérer ce problème, mais la plupart vont simplement générer deux nombres aléatoires pour décider qui va en premier.

Si vous ouvrez le fichier en mode "écriture" (disons que vous vouliez ajouter du contenu au milieu), vous devez verrouiller le fichier pour cela. Le deuxième script PHP va lancer une erreur disant qu'il n'a pas pu ouvrir le fichier.

+0

merci pour l'info. L'image est enregistrée avec la fonction imagejpeg() de PHP, qui indique qu'elle va créer ou écraser le fichier donné, ce qui semble identique à fopen() avec 'w' où il tronque le fichier si et écrit s'il existe ou le crée si ça a disparu. – user126715

+0

donc je pense que le pire scénario est que le serveur 1 essaye de le faire ... ça se fait, mais le serveur 2 a commencé à faire sa propre version avant que le serveur 1 ne finisse (donc 2 n'a pas vu de fichier fini), donc fait, il remplace ce que le serveur 1 vient de faire avec une copie identique. Cela semble fonctionner très bien et c'est vraiment un cas qui n'arriverait probablement pas si souvent. Je pourrais même ajouter une vérification de fichier juste avant la sauvegarde réelle de l'image si je voulais réduire les collisions encore plus loin. Encore une fois, merci pour votre aide! – user126715

Questions connexes