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