Tom: "Academic Locking" von Files

Beitrag lesen

Hello,

ich muss die datei mit fopen "r" öffnen
sperren
auf inhalt von der datei in ein array packen
den inhalt der datei löschen
das array wie gewünscht abändern
und in die datei schreiben
die datei schließen und freigeben?

Nein, das geht nicht.
Und leider bringt Dich der Artikel von Christian Seiler da uch nicht wirklich weiter.
Ich will es daher mal versuchen, ganz einfach zu erklären, auch wenn mich Christian jetzt in der Luft zerreißt.

Du hast eine Datei auf Deinem Server, die Du verändern willst

Dazu musst Du die Datei erst einmal zu deinem Client transportieren
Ein anderer User könnte ungefähr zur gleichen Zeit auf dieselbe Idee gekommen sein.

das bedeutet, dass jetzt auf zwei Clients die Datei vom Zustand  gemeinsam(1) angezeigt wird.

Du änderst die Datei, und schreibst sie zurück. Nun hat die Datei den Zustand A(2)

Der Andere User tut einen Moment später das Gleiche. Nun hat die Datei den Zustand A(3)

Die Problematik hast Du bereits erkannt und deshalb gefragt.

Mit den Methoden, die Christian Seiler beschreiben hat, kommst Du nicht zum Ziel. Dies insbesondere deshalb, weil er touch() benutzt. Das ist hier für eine einfache Lösung aber schädlich.

Wir lösen also erstmal das Problem auf einfache Weise. Diskussion ist dann noch erforderlich.

Du benötigst ein Kriterium, dass gutwillige, aber ja "blinde" Benutzer der Scripte warnt, falls eine Konkurrenzsitzuation aufgetreten ist. Das Betriebssystem, sofern es neuer ist, liefert Dir diese Information. Es ist der Zeitpunkt der letzten Veränderung.

Diesen Zeitpunkt musst Du nur mit der Datei zusammen auslesen und wenn Du sie zurückschreiben LÄSST, voher überprüfen LASSEN.

Wir gehen also erstmal davon aus, dass die Datei bereits vorhanden ist.

Datei mit fopen öffnen zum Lesen
Datei mit flock sperren im shared Mode.
   Der reicht hier aus, weil Du nur verhindern willst, dass während Du liest
   jemand anders gerade schreibt.
Datei lesen mit fread in eine variable
Datei-mtime besorgen mit filemtime() http://de2.php.net/manual/de/function.filemtime.php
Datei schließen (dadurch wird sie automatisch auch zum richtigen Zeitpunkt freigegeben)

Die Variable für den Dateiinhalt un einer textarea ausgeben lassen

<textarea ...><?php echo htmlspechialchars($dateiinhalt); ?></textarea>

die Mtime, die Du beschafft hast, in einem hidden-Field des Formulares mit ausgeben

Das Formular am Client bearbeiten

Das Formular (an sich selbst = Affenformular) zurücksenden
Wenn der "Speichern-Button" gedrückt war

if (isset($_POST['btn']['save']))       ### oder so ähnlich

Datei mit fopen öffnen
Datei mit flock EXCLUSIV sperren
filemtime besorgen
  Vergleichen, ob die Filemtime aus dem Hidden Field vom Client
  identisch ist mit der gerade neu besorgten

Wenn ja

Daten aus dem Post der textarea mit fwrite in die Datei schreiben
  Datei mit ftruncate() abschneiden (das macht man immer erst _nach_ dem Schreiben,
     damit nicht bei einem Fehler beim Schreiben alles weg ist)

Wenn nein

Fehlermeldung an den Client
  "Die Datei wurde zwischenzeitlich von einem anderen user verändert)

(Kompelexere Vorgehensweise später)
     Daten mit fread in eine Variable auslesen
     Daten z.B in einer zweiten textarea wieder ausgeben an den Client
     Die aus der ersten Textarea geben wir auch in der ersten wieder aus.
     Selbes Formular, oder aber pro Textarea eins aber dann auch in jedem
       die hidden-Var mit der aktuelle Mtime einfügen
     Wir geben auch die aktuelle MTime wieder mit aus
     Zweiten Save-Button nit ausgeben, jede Textarea hat jetzt ihren eigenen
     Und das Spiel mit dem Speichern von vorne

Datei schließen

Probleme können darin liegen, dass die mTime zu grob ist (Sekunden-Raster).

Wie Du Zeiklen daraus machen könntest

$var = fread()
   $_zeilen = explode(CRLF, $var)

PS: wenn einer fragt, woher der Name vom "Academic Locking" kommt. Das ist Slang und kommt von der Viertelstunde Unterschied. Man speichert erst CT

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 :-)