Peter Kaufmann: Wie ist das jetzt genau mit flock?

Beitrag lesen

Hallo Andreas,

Es ging um ein Script, welches sich aus einer txt-Datei eine Zahl eingelesen hat, diese um 1 erhöht hat und die neue Zahl wieder zurückgeschreiben hat.

Das habe ich probiert mit einem flock sicher zumachen:
fopen(FILE)
flock(LOCK_EX)
$data = fread()
fputs($data++)
fclose()

Nur wenn jetzt 2 User (fast) gleichzeitig drauf zugreifen, könnte es doch passieren dass der erste User die Datei öffnet, und bevor er die Datei sperrt liest der 2. User die Datei ein, oder? Oder kann sowas definitiv nicht passieren?

Gute Frage, denn der Fall ist gar nicht so theoretisch: Es ist ja möglich, daß die CPU Zeit des ersten Scripts gerade zwischen open und flock verbraucht ist. Erst in der nächsten Systemrunde kann der Prozess dann weiterarbeiten und inzwischen ist Prozess 2 an der Reihe.

Damit flock anständig funktioniert, sollten aber immer _alle_ beteiligten Programme flock verwenden. Der zweite Prozess wird also die Datei öffnen und ein eigenen lock verlangen. Dann gibt es zwei Möglichkeiten:
Prozess 1 ist wieder am Zug und erhält den lock, Prozess 2 wird angehalten bis 1 die Sperre wieder freigibt.
Zweite Möglichkeit: Prozess 2 erhält den lock und 1 muss warten.

Möglichkeit zwei ist dein Fall. Der 2 Prozess wird also tatsächlich die Datei erst auslesen/bearbeiten - Das ist aber nicht wirklich schlimm, da Prozess 1 die Datei (er wartet ja auf seinen exclusiven lock) nicht währenddessen verändern kann.
Und falls Prozess 2 die Datei verändert, liest Prozess 1, wenn er weitermachen darf, eben die veränderte Datei aus (open liefert ja - vereinfacht gesagt - nicht eine ganze Datei sondern nur einen Zeiger auf den Speicher zurück und hier steht halt jetzt etwas neues.)

Grüße,

Peter

p.s.: Oh je, jetzt habe ich mich doch mit einem PHP Problem befasst - !@#$*.  ;-)