Tom: Datei organisisert sperren

Beitrag lesen

Hello,

es geht konkret um die in ein ErrorHandling-Objekt implemetierte Errorlog-Datei für schwerwiegende Fehler gehen. Es geht um die Problematik, wenn 2 oder mehrere Script gleichzeitig auf error.log zu greifen. Die Scripte sollen nacheinander ihre Fehlermedlung ins die error.log schreiben nicht gleichzeitig, dazu habe ich flock() verwendet:

Das ist für Error-Logs eigentlich überskaliert.
Die üblichen Betriebssysteme halten immer noch den Filetyp "Textdatei" vor. Das ist eine rein serielle Datei, die man dann im Filemode Append ('a') oder Append/Read ('a+'), zur Sicherheit für die Binärfestigkeit auch ('ab') oder ('ab+') öffnen sollte, bzw. sogar eigentlich nur kann.

Hier kümmert sich das Filesystem automatisch um das Positionieren des Dateizeigers _ans__ENDE_ der Datei und das Serialisieren der Zugriffe unterschiedlicher Prozesse.

[PHP hatte hier zeitweise einen Fehler und man konnte den Dateizeiger auch zum Schreiben trotzdem vor dem Ende positionieren. Der ist aber mWn inzwischen behoben. Steht der Dateizeiger nicht am Ende der Datei, wenn der Prozess an der Reihe ist, wird er automatisch dorthin verschoben.)

Du musst Dir daher um das Locking derartiger Dateien keine Gedanken machen.

Anders ist es, wenn Du ein blockorientierten Zugriff wünscht, also auch wahlfrei positionieren können willt zum Schreiben (und zum Lesen, aber das ist für die vorhandenen Daten unschädlich, wenn auch nicht unherheblich).

Die 'a'-Modi haben zudem noch den Vorteil, dass die Datei auch angelegt wird, wenn sie noch nicht vorhanden war. Man muss also nicht erst prüfen, ob die Datei existiert, bevor man sie öffnet - was ja aus dem Gesichtspunkt von TOCTTOU auch nicht in zwei Schritten geschehen darf!

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
 ☻_
/▌
/ \ Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de