Hello,
Was ist eigentlich mit dem Flag LOCK_EX, das man bei file_put_contents() setzen kann?
Das war mir zwar auch entgangen, dass es das jetzt gibt (seit Version 5.1), aber es nützt hier nichts.
Zum verlustfreien Bearbeiten von Daten muss der gesamte Lese- und Scheibprozess mit einem gemeinsamen EXCLUSIVE LOCK geschützt werden.
Um sicherzustellen, dass keine Überschneidungen mit anderen Prozessen stattfinden, muss zum Zwecke der _sofortigen_ Veränderung nebst Wegschreiben auch der Prozess des Holens im LOCK_EX-Zeitabschnitt stattfinden. Dadurch wird der Prozess der Datenveränderung "Atomar".
Mit file_get_contents() und file_put_contents() ist dies nicht möglich, da sie immer auf zwei Prozesse verteilt bleiben werden. Dies ermöglicht immer einem dritten Prozess das Eindringen in die zeitliche Abfolge.
Anstelle der von mir benutzten Variante mit "a" kann man auch "x" benutzen, muss dann aber den Fehler auswerten.
Im Prinzip ist advisory Locking, dass ja immer mit einem seperaten Lockbefehl nach dem fopen() arbeitet, immer noch eine relativ störanfällige Methode. Mandatory Locking (von System36 / AS400 auf die PCs und ELS2 von NOVELL übertragen), ist wesentlich sicherer.
Hier werden die Anforderungen im OS-Kern für das Filesystem gebündelt. Man fordert also ein fopen gleich mit dem Attribut SINGLE_OPEN (Kompatibility Mode), SHARED, LOCK_SH oder LOCK_EX an, wobei SHARED nur bedeutet, das keine einschränkenden Attribute gesetzt sind.
Es hat also auch KEINEN Sinn,
------
<-----------+
die Datei zu öffen |
mit LOCK_SH zu versehen |
|
auszulesen | Dieser gesamte Bereich ist noch gefährdet,
die Daten zu verändern | dass weitere Prozesse dasselbe beginnen.
|
ein LOCK_EX anzufordern <-----------+
die Daten wegzuschreiben
die Datei zu schließen und zu entsperren
<------------ und dann ggf. erst hier ein eigenes
LOCK_EX anfordern
um Daten zurückzuschreiben
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)
