Der Martin: Einfacher Counter performance touch()

Beitrag lesen

Hallo Hans,

Nur wenn man das Sperren von Dateien vernachlässigt.
wollte jetzt nicht so weit ausholen, aber ok. Bei der klassischen Variante nutze ich natürlich eine Sperrung, allerdings nur beim schreiben in etwa so:

file_put_contents($file,file_get_contents($file)+1,LOCK_EX);

betrachten wir mal, was bei dieser Anweisung tatsächlich nacheinander passiert:

1. Aufruf von file_get_contents, Ergebnis (String) landet in einem temporären internen
    Speicher (nennen wir ihn "R" wie Register)
 2. Der Inhalt von "R" wird in eine Zahl umgewandelt, dann 1 dazu addiert und wieder
    abgelegt (jetzt als Zahlenwert)
 3. Aufruf von file_put_contents() mit dem Inhalt von "R" und der Konstante LOCK_EX als
    Parameter

Genaugenommen ist nur in Schritt 3 die Datei gegen andere Zugriffe gesperrt. Das ist aber unnötig, denn AFAIK arbeiten file_get_contents() und file_put_contents() auch schon von sich aus "atomar", also nicht unterbrechbar, auch ohne dass man sich explizit drum kümmert. Zwischen den genannten Schritten kann der Prozess aber immer noch unterbrochen werden.

Was bedeutet das nun, wenn ich Martins anschauliches Beispiel zu Rate ziehe?
Ein gleichzeitiger Zugriff hat den gleichen Ausgangswert und somit geht ein Zugriff aufgrund der gleichen Zahl verloren, richtig?

Richtig, das Risiko besteht immer noch.

Wenn ich nun aber die komplexere Version mit FLOCK benutze und auch die Datei fürs Lesen sperre, dann würde PHP einen der beiden gleichzeitigen Aufrufe in Wartestellung setzen bis die Datei wieder entsperrt wurde und es wäre absolut Verlass auf die Eintragungen, richtig?

Ja. Wobei man sich dann durch Denk- und Verständnisfehler auch "zu Tode sperren" kann. ;-)

Falls dem so ist, wäre auch meine Anfangsfrage gelöst, denn dann kann ein Counter auf Basis touch(), oder rename() nicht richtig funktionieren, weil ein klare Sperrung nicht machbar wäre. Denn dann ändert sich ja der Dateiname und eine Lesesperre wäre nur aktiv für eine Datei die nun aktuell gar nicht mehr existiert, richtig?

Richtig.

Ciao,
 Martin

--
Zwei Mäuse treiben's miteinander. Sagt der Mäuserich: "Hoffentlich ist nicht wieder alles für die Katz."
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(