2010-01-14 8 views
7

Verwendung:Gleichzeitige File Access

fopen 
fwrite 
fclose 

Was passiert, wenn zwei Benutzer die gleiche Datei zur gleichen Zeit zu öffnen versuchen?

+4

Ich bin mir nicht sicher, die genaue Antwort. Aber ja, jemand hat das versucht. –

+0

Hängt auch vom Betriebssystem ab. –

+1

Dies ist ziemlich genau der Grund, warum MySQL 3.x in den Anfängen der Webentwicklung so populär wurde. –

Antwort

6

Kleinere Dateioperationen sind so schnell, dass zwei Schreibvorgänge zur genau gleichen Zeit ziemlich selten sind. Unabhängig davon, können Sie flock verwenden, um die Datei zu sperren:

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

Hinweis fclose die Datei automatisch entriegelt, aber das finde ich es den Code macht ein wenig benutzerfreundlicher in diese Dinge zu setzen

+0

+1, prägnant ... nicht wie meine Waffel! –

+0

Was passiert, wenn der Interpreter die Datei sperrt, aber bevor der Server es öffnet, stirbt der Server, so dass er nicht entsperrt wird :) – ajsie

+0

@noname - Yup. Schließsysteme müssen oft arbitrieren, Konsens erzielen und mit diesen Dingen umgehen. –

1

Ja, Sie können zwei Dateien gleichzeitig öffnen, es sei denn, Sie sperren die Datei [flock]. Der beste Zeitpunkt für das Zusammenfassen einer Datei ist jedoch, wenn Sie darauf schreiben oder wenn Sie nur einem Benutzer erlauben, eine Datei an einem bestimmten Punkt anzuzeigen.

3

Was wichtig ist:

  1. Was passiert, wenn sie
  2. schreiben Was passiert, wenn (a) liest, (b) liest dann (b) schreibt dann (a) schreibt? Ist (a) der Schreibvorgang ungültig, weil die Berechnung nicht mehr vom letzten Zustand abgeleitet wird?

Das klassische Beispiel ist das Cash machine/bank balance Beispiel in vielen Texten verwendet.

Jede Art von gemeinsamen beschreibbaren Zustand irgendeine Form von gleichzeitige Zugriffskontrolle wie ein mutex erfordert, aber es gibt jede Menge potenzielle Probleme wie race conditions, Hunger und Variationen der dining philosophers problem.

Viele Betriebssysteme erlauben jedoch File locking einer bestimmten Beschreibung, was bedeutet, dass der andere Prozess darauf wartet, dass die Sperre freigegeben wird. Siehe PHP's flock() for locking a file.

Sie können auch einen "Auschecken, Ändern, Festschreiben/Zusammenführen" -Ansatz verwenden.

Je nach Gründen, können Sie liefern zu prüfen, eine Datenbank wie MySQL oder SQLite da diese schneller, robuste Möglichkeiten Zustand zu teilen, die schreib schwere oder Cache-less.

Die zahlreichen Probleme, Fallstricke und Möglichkeiten, den Staat zu teilen, sind enorm. Entschuldigung für die gesamte Wikipedia-Nutzung.

1

passiert die ganze Zeit. Die Antwort auf Ihre Frage hängt jedoch davon ab, was genau Sie mit der geöffneten Datei wollen/wollen. Die möglichen Aktionen/Lösungen hängen ausschließlich von dieser Anforderung ab.

3

. Verwenden Sie file_put_contents() stattdessen mit den FILE_APPEND oder LOCK_EX Flags.

Alle diese Flags sperren die Datei zum Schreiben.