dedlfix: Einfacher Counter performance touch()

Beitrag lesen

Tach!

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);

Dann fummelt dir während des Schreibprozesses keiner dazwischen. Insbesondere können lesende Zugriffe keine erst halbgeschriebenen Dateien lesen - wenn sie beim Lesen ebenfalls den Sperrmechanismus berücksichtigen, denn der ist freiwillig.

Was bedeutet das nun, wenn ich Martins anschauliches Beispiel zu Rate ziehe?

Zwischen Lesen und Schreiben können dir andere Prozesse dazwischengrätschen. Der ganze Vorgang des Lesens, Ändern und Schreibens muss atomar sein.

Ein gleichzeitiger Zugriff hat den gleichen Ausgangswert und somit geht ein Zugriff aufgrund der gleichen Zahl verloren, richtig?

Ja.

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?

So der Plan.

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?

Weiß nicht, hab mich mit dem Aspekt der Frage nicht weiter beschäftigt ... mach's nicht zu kompliziert. Nimm lieber bewährte Lösungen statt unausgereiftem Eigenbau, wenn du zum Ziel gelangen willst und dieses nicht "der Weg" heißt.

dedlfix.