Hi nochmal!
Die Befehle die Ihr mir gepostet habt, kenne ich, aber mein Problem
liegt glaube ich da, dass ich nicht genau weiss, wo sie hingehören.
if ($cur->param("message")) { # Es existiert ein Eintrag
An dieser Stelle prüfts Du, ob jemand einen neuen Eintrag inzufügen will.
im Parameter "message" steht offensichtlich der Text.
$cur->param("date", scalar localtime); # aktuelle Zeit
Hier wird noch die aktuelle Zeit eingefügt
@entries = ($cur); # Speichern des Eintrags in das Array
zur Weiterverarbeitung abgespeichert. Davor muß nun diese Änderung rein.
}
Also so (zum Verständnis schön in einzelnen Schritten):
if ($cur->param("message")) { # Es ...
###neu
$temp = $cur->param("message"); # lesen
$temp = s/(\r\n)|(\n)/<BR>/g; # \n gegen <BR> tauschen
$cur->param("message", $temp); # schreiben
###
$cur->param("date", scalar localtime); # aktuelle Zeit
@entries = ($cur); # Speichern ...
}
Über einen Teil sollte aber auch noch diskutiert werden:
open the file for read-write (preserving old contents)
open(CHANDLE, "+< $CHATNAME") || bail("cannot open $CHATNAME: $!");
get exclusive lock on the guestbook
($LOCK_EX == exclusive lock)
flock(CHANDLE, $LOCK_EX) || bail("cannot flock $CHATNAME: $!");
Das flock soll verhindern, das die Datei von 2 Prozessen gleichzeitig geöffnet wird (2 User posten gleichzeitig einen Eintrag). Über diesen Mechanismus wurde schon viel diskutiert...
Eigentlich funktioniert das so:
Prozess1: öffnet die Datei
Prozess1: setzt exclusive lock
Prozess1: bearbeitet Datei
Prozess1: Schließt Datei hebt damit den lock wieder auf
Jetzt mit 2 Prozessen:
Prozess1: öffnet die Datei
Prozess1: setzt exclusive lock
Prozess2: öffnet die Datei
Prozess2: will exclusive lock setzen,
kann aber nicht, da bereits
gesetzt, wird vertagt
Prozess1: bearbeitet Datei
Prozess1: Schließt Datei hebt
damit den lock wieder auf
Prozess2: wird geweckt, kann nun
exclusive lock setzen
Prozess2: bearbeitet Datei
Prozess2: Schließt Datei hebt
damit den lock wieder auf
(Vorausstzung: open und flock sind auf Deinem Server richtig implementiert - Stichwort atomare Befehle)
Damit merkt der User, der den 2. Prozess gestartet hat, nicht, dass ein Zugriffskonflikt stattfand, es dauert nur etwas länger. Bei Dir passiert aber etwas anderes: Der 2.Prozess wird mit einer Fehlermeldung beendet. Es reicht also diese Zeile:
flock(CHANDLE, $LOCK_EX);
Na dann,
Gruß Frank
P.S. Hoffentlich ist die Formatierung nach dem Absenden noch lesbar.