Danke für die Hilfe
Hoffe, ich kann Dir so helfen. Es gibt für PHP ein sehr gutes FAQ unter http://www.dclp-faq.de. Dort habe ich folgendes zum Thema gefunden:
Antwort von Kristian Köhntopp
Für dieses Problem gibt es keine elegante oder effiziente Lösung. Die Ursache liegt darin, wie Unix und Windows die unterliegenden Dateien handhaben, nämlich als unstrukturierte Byteströme. Für diese Byteströme gibt es keine Indices und auch keine Methoden, mit denen man effizient beliebige Teile der Datei löschen oder in die Datei einfügen könnte.
Tatsächlich ist der Wunsch nach einfachen Einfüge- und Löschoperationen der Auslöser für die Schaffung von Datenbankfunktionen wie die DBM-Funktionen oder von ganzen Datenbanken wie MySQL gewesen. Wenn man auf diese Sorte Problem trifft, sollte man also intensiv über den Einsatz von DBM-Dateien oder Datenbanken nachdenken.
Um in einer Datei eine Zeile einzufügen oder zu löschen, muß man die Datei öffnen und zeilenweise durchlesen und in eine zweite Datei schreiben. Erreicht man die gewünschte Position, muß man dort eine Zeile einfügen oder löschen. Nach Abschluß der Operation ist die Originaldatei zu löschen und die neue Datei umzubenennen. Dabei ist zu beachten, daß in einer Webumgebung ohne weiteres mehrere Benutzer zugleich eine solche Operation für dieselbe Datei anfordern können. Man muß also auch durch Locking dafür Sorge tragen, daß sich diese Benutzer nicht in die Quere kommen.
Shared lock auf die Quelldatei
$old = fopen($oldfile, "r");
flock($old, 1) or die("Kann die Quelldatei $oldfile nicht locken.");
Exclusive lock auf die Zieldatei
$new = fopen($oldfile.".new", "w");
flock($new, 2) or die("Kann die Zieldatei $newfile nicht locken.");
$lineno = 0;
while($line = fgets($old, 1024)):
if ($lineno++ == $zielzeile)
continue; # Zeile auslassen
fputs($new, $line);
endwhile;
fclose($old); # Gibt das Lock automatisch auf
Alte Datei wegwerfen.
unlink($oldfile);
Neue Datei umbenennen.
(In Windows müssen das rename() und das fclose($new)
# vertauscht werden, da es nicht möglich ist, in Windows
# eine offene Datei umzubenennen.
rename($oldfile.".new", $oldfile);
Neue Datei schließen und dabei Lock aufgeben.
fclose($new);
Gruß,
Nils