Hello,
Ok. ok. Hier das komplette Skript mit allen Einbauten.
Sorry Sir, aber das ist falsch. Es muss der komplette Updatevorgang gekapselt (locked) werden, da sonst kein quasi-atomarer Zustand hergestellt wird.
if (file_exists($filename)) ## das kann man sich schenken, wenn man $daterihandle prüft
{ ## und Warnings im Betrieb ausschaltet, dafür aber
## $php_errormsg abfragt --> gibts aber auch noch Fallen
$datei = fopen($filename,"r+");
$lock_ok = flock($datei,LOCK_EX
$daten_alt = fread($datei,filesize($filename));
##fclose($datei); ## offen lassen
}
diesen Block macht man vorher
if (isset($_POST['abschicken'])) {
$kommentar = stripslashes(htmlentities(($_POST['kommentar'])));
$kommentar = str_replace("\n","<br>",$kommentar);
# str_replace ist bei einfachen Erstzungen schneller# abbrechen, wenn $kommentar leer ist:
if ($kommentar=="") {
header ("Location: $this_uri");
exit;
}
dafür hatte ich eine elegante Funktion vorgestellt
# Die anderen Variablen sind genau so zu behandeln:
$name = stripslashes(htmlentities(($_POST['name'])));
$email= stripslashes(htmlentities(($_POST['email'])));
$url = stripslashes(htmlentities(($_POST['url'])));# Basteln
$daten_neu = "<hr><b>Name:</b> $name<br>
<strong>Ort:</strong> $ort<br>
<strong>Email:</strong> <a href=mailto:$email>$email</a><br>
<strong>Homepage:</strong> <a href=$url>$url</a><br>
<strong>Datum:</strong> " . date('d. F Y H:i') . "<br>
<strong>Eintrag:</strong><br>
$kommentar<br>\n\n";# Hier wird es ernst:
if ($neu_vor_alt) {
$daten=$daten_neu.$daten_alt;
} else {
$daten=$daten_alt.$daten_neu;
}
ist schon offen
# Flatfile öffnen und überschreiben:
if (fseek($datei,0,SEEK_SET) !=0) die ('irgendein blöder Dateifehler');
fwrite($datei, $daten);
ftruncate($datei,strlen($daten));
fclose($datei); ### fclose() löst auch den Lock auf.
header ("Location: $this_uri");
exit;
}
Hier wird jetzt mit Blocking Lock gearbeitet. Der hält das Script solange an, bis die Lockanforserung Erfolg hatte oder die max_execution_time beendet ist.
Wird Zeit, dass mein Artikel fertig wird. hat schon 18 Seiten im Druck und ich hab immer noch Stoff.
Die letzte Anregung kam gerade wieder durch Sven rautenberg, weil Lunix/Unix mit Dateidescriptoren ganz anders verfährt, als WinDOS. Musste ich doch glatt noch ne Testrunde einlegen. Ich wusste dsa zwar eigentlich, aber dran gedacht habe ich nicht. Ich bin halt NOVELL+DOS-geschädigt.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau