Moin!
ich arbeite bei unserem Gästebuch mit Textdateien.
Dazu gibts diverses zu kommentieren.
Die Textdateien bestehen dabei aus einzelnen Zeilen, die ich mittels des Kennzeichens (?) "PHP_EOL" trenne, die einzelnen Informationen der Zeilen wiederum sind durch "|" voneinander abgegrenzt.
PHP_EOL ist eine plattformabhängige Konstante, die das gebräuchliche Zeilenendezeichen enthält. Damit würde ich NICHT arbeiten, denn es sorgt dafür, dass deine Datei plattformabhängig wird, und wenn du das gesamte Skript auf eine andere Plattform kopierst, funktioniert es nicht mehr korrekt. Verwende immer feste Zeichen zur Kennzeichnung von wichtigen Dateiformatierungen. Auch unter Windows funktioniert das Unix-Zeilenende "LF" prima.
Hier der php-Code zum Einlesen der Einträge:
Der Code macht ziemlich viel Brimborium, ohne dass sich dafür direkt ein Sinn ergibt.
Und er macht Dinge falsch.
$Datei = "../Textdateien/Gaestebuch__Eintraege.txt";
$Dateiname = substr ($Datei, 15);
Funktion basename() existiert. Dann muss man nicht abzählen, wie lang der Pfad in der Variablen ist.
if (file_exists ($Datei))
{
if (is_readable ($Datei))
is_readable() enthält die Abfrage für file_exists() schon - das muss man nicht doppelt tun, spart dir eine Einrückungsebene ein.
{
$Zeiger = @fopen ($Datei, "rb");
An dieser Stelle die Fehler zu unterdrücken ist eventuell keine so schlaue Idee. Schließlich hast du ja zahlreiche Testfunktionen drumherum genau deswegen, dass Fehler abfangbar werden.
Und das Locking macht man, wenn man es benötigt, sofort nach dem Dateiöffnen!
if ($Zeiger)
{
fseek ($Zeiger, 0, SEEK_END);
$Dateigroesse = ftell ($Zeiger);if ($Dateigroesse > 0)
{
$Versuche = 0;do
{
if ($Versuche > 0)
{
usleep (rand (1, 10000));
}$Versuche += 1;
}
while (! flock ($Zeiger, LOCK_EX) and $Versuche <= 100);
Und nicht erst Zahlreiche Millisekunden und eine unbekannte Verzögerungszeit später.
Abgesehen davon ist diese Schleife hier sowieso überflüssig, weil du kein nicht-lockendes flock() aufrufst.
if ($Versuche === 100)
Wenn du dich mit der Zahl 100 und der Schleife und den Bedingungen verrechnet hast, könnte der Fall eintreten, dass $Versuche nicht === 100 ist, aber die do/while-Schleife dort oben aufgegeben hat. Nicht gut!
flock() gibt den Erfolg als Funktionsergebnis zurück. Zähle nicht mit, sondern werte diesen Wert aus.
{
$Meldung = 'Die Datei "' . $Dateiname . '" kann nicht verriegelt werden';
}
else
{
echo "Lese Datei<br><br>";$Inhalt = @fread ($Zeiger, $Dateigroesse);
flock ($Zeiger, LOCK_UN);
fclose ($Zeiger);
Locking-Tutorial, erste Seite, erster Absatz: Niemals eine Datei vor dem fclose() entsperren. fclose() macht das von allein, und genau zu dem richtigen Zeitpunkt dann, wenn alle Puffer auf Platte geschrieben wurden etc. Wenn du das selbst machen würdest, könnte immer noch ungünstiges Zeugs passieren.
echo "<br><br>Datei eingelesen";
var_dump ($Inhalt);
}
}
}
}
}
Abgesehen davon: Wenn du in diesem Skript nur die Gästebuchdatei lesen willst, würde ich persönlich gar keinen großen Aufwand mit Locking betreiben. file_get_contents() funktioniert viel einfacher.
- Sven Rautenberg