2010-01-14 9 views
7

aide:fichier Accès simultané

fopen 
fwrite 
fclose 

Qu'advient-il si deux utilisateurs tentent d'ouvrir le même fichier en même temps?

+4

Je ne suis pas sûr de la réponse exacte. Mais oui, quelqu'un a essayé cela. –

+0

Cela dépend également du système d'exploitation. –

+1

C'est à peu près la raison pour laquelle MySQL 3.x est devenu si populaire dans les premiers jours du développement web. –

Répondre

6

Les opérations de fichiers à petite échelle sont si rapides que deux écritures au même moment sont assez rares. Peu importe, vous pouvez utiliser flock pour verrouiller le fichier:

$fp = fopen('file.log', 'a+'); 
flock($fp, LOCK_EX); 
fwrite($fp, 'my data'); 
flock($fp, LOCK_UN); 
fclose($fp); 

Remarque fclose débloque automatiquement le fichier, mais je trouve cela rend le code un peu plus convivial pour mettre ces choses dans

+0

+1, concis ... pas comme ma gaufre! –

+0

que se passe-t-il si l'interpréteur verrouille le fichier mais qu'avant de pouvoir le déverrouiller le serveur meurt donc il ne sera pas déverrouillé? :) – ajsie

+0

@noname - Yup. Les systèmes de verrouillage doivent souvent arbitrer, parvenir à un consensus et régler ces problèmes. –

1

Oui, vous pouvez ouvrir deux fichiers en même temps, sauf si vous verrouillez le fichier [flock]. Pourtant, le meilleur moment pour rassembler un fichier serait quand vous écrivez dessus, ou si vous choisissez de permettre seulement à un utilisateur d'afficher un fichier à n'importe quel point.

3

Ce qui est important est:

  1. Qu'est-ce qui se passe quand ils écrivent
  2. Qu'est-ce qui se passe si (a) lit, (b) lit alors (b) écrit alors (a) écrit? L'écriture de (a) est-elle invalide parce que son calcul n'est plus dérivé du dernier état?

L'exemple classique est le Cash machine/bank balance exemple utilisé dans de nombreux textes.

Tout type de partagé état inscriptible nécessite une certaine forme de contrôle d'accès simultané comme un mutex, mais il y a des tonnes de problèmes potentiels tels que race conditions, la famine et les variations du dining philosophers problem. De nombreux systèmes d'exploitation autorisent cependant File locking d'une certaine description, ce qui signifie que l'autre processus attend que le verrou soit libéré. Voir PHP's flock() for locking a file.

Vous pouvez également utiliser une approche "extraire, modifier, valider/fusionner".

En fonction de vos raisons, vous pouvez envisager une base de données comme MySQL ou SQLite que ceux-ci fournira plus rapide, plus robuste façons de partager l'état qui est lu lourd ou cache-moins.

Les nombreux problèmes, pièges et modes de partage sont vastes. Toutes mes excuses pour tout l'usage de Wikipedia.

1

Ça arrive tout le temps. Cependant, la réponse à votre question dépend de ce que les deux veulent/voudraient faire avec le fichier ouvert. Les actions/solutions possibles dépendront uniquement de cette exigence.

3

. Utilisez plutôt les indicateurs file_put_contents() avec les indicateurs FILE_APPEND ou LOCK_EX.

L'un de ces indicateurs verrouille le fichier en écriture.

Questions connexes