Tom: PHP flock() mit race condition gelöst?

Beitrag lesen

Hello,

Ja, so kannst du das machen.

$lockdatei = "post.lock";
$datendatei = "daten.dat";
flock($lockdatei, LOCK_EX);

Das flock() musst du auf einen File descriptor anwenden, also so:
$lockdatei = "post.lock";
$lockh = fopen($locdatei,"a+") or die("error in open()!");

flock($lockh,LOCK_EX) or die("Error in locking!");

Bei PHP wirst Du den 'or'-Zweig nicht mehr zu sehen bekommen.
flock() liefert in der Default-Einstellung erst false, wenn das Script-Timeour erreicht ist.
Um Deiner Anweisung Sinn einzuhauchen muss man

flock($lockh,LOCK_EX+Lock_NB) or die("Error in locking!");

schreiben.

Dann wird genau ein Lockzyklus versucht. 'Zyklus' bedeutet, dass das OS entscheidet, wieviele Locks auf der untersten Schicht wirklich versucht werden. Standard wären 5 einzeln atomare Lockversuche. Die haben zwischen sich dann kleine zeitliche Lücken, damit andere Prozesse ggf. dazwischenschlüpfen können.

Das ist aber ggf. bei unterschiedlichen OS auch unterschiedlich geregelt. Ich kann da bisher nur mit hoher Sicherheit für DOS-Derivate und Novell sprechen. Versuche taugen hier i.d.R. wenig. Da muss man schon in den Assembler-Code einsteigen.

@CK:
Wir hatten das Thema aber schon einmal aufgegriffen und ich bat um Zurückstellung. Ich habe es noch nicht vergessen. Leider habe aber bisher weder Zeit für die angemessenen Dokus noch Geld für die notwendige Literatur gehabt. Wenn die hier nur herumliegt und schimmelt, bringt das auch nichts.

Harzliche Grüße aus http://www.annerschbarrich.de

Tom

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