FlatBox - Dokumentation

3. File-Locking

Gleichzeitigem Zugriff von mehreren Usern vorbeugen

Ein wichtiger Faktor beim Arbeiten mit Flatfiles ist, für ein sauberes Sperren der Datei mit der man arbeitet zu sorgen, damit während dem Auslesen oder Schreiben kein anderes Script ebenfalls Eingriffe in die Datei vornehmen kann. Würde man nicht sauber Sperren, so könnte z.B. folgender Fall auftreten: Zwei User rufen gleichzeitig das Script auf, User A will eine Löschung vornehmen, User B will einen Datensatz einfügen. Nun würden zwei Scripte gleichzeitig in einer Datei rumpfuschen - was dabei herauskäme, wäre eine zerstörte Datei, die nicht weiter verwendet werden könnte.

PHP kennt für das Sperren von Dateien die Funktion flock() - hierbei handelt es sich allerdings mehr um einen Soft-Lock Mechanismus, dass heißt, dass dieser Sperr-Mechanismus nicht auf Betriebssystems-Ebene implementiert ist (und damit nicht mehr zu umgehen wäre - unabhängig von der verwendeten Scriptsprache).
Eine solche Sperrung einer Datei für alle Prozesse ist nur unter Windows möglich - es liegt vermutlich einfach nicht in der Art eines Linux/Unix, sich über den User zu stellen und ihm den Zugriff auf eine Datei, die gerade anderweitig in Gebrauch ist, zu verwähren.
Solange jedoch alle Scripte Gebrauch von dieser Funktion machen, so sollte es zu keinem Konflikt kommen. Verzichtet nun aber ein Script auf die Verwendung von flock() und schreibt einfach direkt in eine geöffnete Datei hinein, so kommt es natürlich weiterhin zu Konflikten.

Deshalb ist sicherzustellen, dass man in allen seinen Scripten (auch wenn es nur ein einziges Script ist, dass auf eine Datei zugreift, denn es könnten ja zwei User das Script gleichzeitig aufrufen, was gar nicht mal so unwahrscheinlich ist) auf die korrekte Verwendung von flock() achtet und sollte es mißlingen die Datei zu sperren, alle weiteren Operationen mit der Datei abbricht.

Ablauf eines Sperr-Vorgangs

Der korrekte Ablauf eines Sperrvorgangs sieht wie folgt aus:

  1. Datei öffnen¹
  2. Datei für Lese- oder Schreibzugriff sperren, ist dies nicht möglich, abbrechen
  3. Operationen in der Datei durchführen, gemäß der erfolgten Sperrung
  4. Datei wieder freigeben und schließen

¹ Achtung: Es gibt für die Funktion fopen() die Möglichkeit als Modus beim Öffnen w oder w+ angegeben wird. Dabei wird sofort mit dem Öffnen der Datei der Inhalt der gesamten Datei gelöscht. In diesem Fall bring ein nachträgliches flock() auch nichts mehr, da der Konflikt dann schon längst aufgetreten ist.
Hierbei empfiehlt es sich, eine sogenannte Dummy-Datei zu verwenden. Dabei sieht der Ablauf des Arbeitens mit der Datei so aus:

  1. Dummy-Datei öffnen
  2. Dummy-Datei für Schreibzugriff sperren, ist dies nicht möglich, abbrechen
  3. Richtige Datei öffnen (mit w bzw. w+)
  4. Richtige Datei zur Sicherheit auch noch sperren, nötig ist es aber nicht, sofern alle Scripte vorher die Dummy-Datei sperren
  5. Operationen in der richtigen Datei vornehmen
  6. Richtige Datei freigeben und schließen
  7. Dummy-Datei freigeben und schließen