Tom: file-locking um konkurrierende Datei-Zugriffe zu regeln?

Beitrag lesen

Hello,

Was aber in PHP nicht ganz so einfach ist, oder? Was meinst Du jetzt mit "Update-Prozess"? Doch die "Prozedur" des Aktualisierens selber, oder?

Doch das geht auch mit PHP. Lies Dir nochmal meine Antwort oben durch

Mal angenommen Du wolltest eine Funktion schreiben, die wie ein Counter steigende Nummern zurückgibt, meinetwegen:

$next_id = get_next_id();

Die Id soll wie bei MySQLs Auto-Increment bei jedem Aufruf immer um 1 erhöht werden. Das Script mit der Funktion wird von verschiedenen Apache-Prozessen konkurrierend aufgerufen.

Das geht nur, wenn alle Prozesse dieselben Regeln berücksichtigen, am besten dasselbe "API-Script". Sonst benötigt man mandatory Locking.

Wie würdest Du das jetzt implementieren, das heißt sicherstellen dass es keine doppelten IDs gibt (was ja passiert wenn die Datei mit der aktuellen ID von einem 2. Prozessen zw. fopen() und flock() aufgerufen wird )?

Das habe ich oben schon beschrieben:

Datei öffnen Handle besorgen
  Exclusive Lock beantragen
  Zähler auslesen
  Zähler incrementieren und merken
  Zähler zurückschreiben
  Datei schließen

Schlüssel zurückliefern

Außer, dass da unerwünschte Dateioperationen (rm, chmod, mv) oder ein Connection Loss stattfinden können, kann nichts schlimmes passieren. Und dass diese Veränderungen nicht stattfinden, dafür muss man sorgen und für den Fall dass doch, immer die Fehler abfragen.

Das Verfahren basiert natürlich auf "Lost Keys". Das bedeutet, dass ungenutzte Schlüssel einfach verloren gehen.

Eine externe Lock-Datei hat IMHO gerade bei besonders vielen Zugriffen den Nachteil, dass es zu einem Dead-Lock kommen kann, falls ein Prozess stirbt...

Wenn ein Prozess stirbt, gibt PHP automatisch die Handles zurück und das OS löst automatisch die Locks wieder auf.

Liebe Grüße aus http://www.braunschweig.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau