Frage von KieranMeow, 39

Wie lösche ich die erste Zeile in einer Datei?

Hallo. Ich bastel im moment an einem PHP script das die erste Zeile in der Datei "msg" löschen soll. Hier ist was ich im Internet gefunden habe:

$file = "msg";

$contents = file_get_contents($file);
$first_line = substr($contents, 0, 32);
file_put_contents($file, substr($contents, 32 + 2)); //+2 because we remove also the \r\n

Aber beide versionen die ich gefunden habe funktionieren nicht :/ Könnt ihr mir helfen?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von TanteHolger, 26

Hi,
versuch es mal so.

$contents = file_get_contents($file);
$array = explode('\n\r', $contents);
if (isset($array[0])) unset($array[0]);
$string = implode('\n\r', $array);
file_put_contents($file, $string);

Gruß: Holger


Kommentar von KieranMeow ,

Irgendwie auch alles aus der Datei weg. Ich schau mal ob ich einen anderen weg finde. Danke ^^

Kommentar von TanteHolger ,

Hier eine funktionierende Lösung.

$file = "bla.txt";
$contents = file($file);
if (isset($contents[0])){unset($contents[0]);}
file_put_contents($file, $contents);

Gruß: Holger

Kommentar von KieranMeow ,

Danke funktioniert ^^

Expertenantwort
von TeeTier, Community-Experte für programmieren, 12

Ohne Locking wirst du dabei früher oder später Datensalat erhalten. (Mit anderen Worten: Der Inhalt deiner Datei geht kaputt!)

Demnach sind alle Ansätze, die file_get_contents() und file_put_contents() verwenden fehlerhaft.

Ich habe jetzt aber keine Lust, dir dazu eine Lösung zu basteln, denn die ist - sofern man Race-Conditions vermeiden will - mit PHP alles andere als trivial. (Hab das vor einer Weile mal für einen anderen Fragensteller gemacht, und bin bei ca. 50 bis 60 Zeilen Code gelandet!)

Wenn deine Website eher mäßig frequentiert ist, wirst du vielleicht vorerst keine Probleme bekommen, besonders wenn die Größe deiner Datei unter einem Block des Dateisystems liegt. (Das sind oft 512, 2048, 4096 oder 8192 Byte).

Aber lass dir gesagt sein, das 99% aller Lösungen, die du zu dem Thema finden wirst, fehlerhaft sind und unzuverlässig arbeiten werden. (z. B. die Antwort von TanteHolger ... nicht persönlich gemeint! Bitte nicht angegriffen fühlen!)

Das ist auch der Grund, warum man bei so etwas lieber auf Datenbanken setzen sollte, denn die bieten Transaktionen an, und sorgen für Integrität. Beides wird dir bei reinen Textdateien fehlen!

PS: Inzwischen gibt es PHP 7 und file_get_contents() hat immer noch kein $flags Argument, wie sein Zwillingsbruder file_put_contents()! Man kann somit NICHT zuverlässig LOCK_EX einsetzen und wird früher oder später beim Lesen Müll erhalten.

(Wobei der File-Locking-Mechanismus stark von der Implementierung und der Plattform abhängt, und man nie sicher sagen kann, ob LOCK_EX jetzt eine Datei gesperrt hat, oder nicht. Will man sich alternativ auf die SysV-IPC Mechanismen z. B. aus dem "Synch"-Modul verlassen, rennt man früher oder später in einen Deadlock [den man dann nur noch durch einen Reboot beseitigen kann], falls das PHP-Skript nicht zu 100% korrekt arbeitet ... aber das ist ein anderes Thema ...)

Von daher muss man diese beiden Funktionen als "nicht benutzbar" ansehen und vor deren Verwendung warnen. Leider sind sie bei Anfängern ultra-beliebt. ><

Im Single-Thread funktionieren sie zwar wie gewünscht, aber wenn ich mich recht erinnere, wurde PHP ursprünglich mal für Server entwickelt, wo vieles parallel läuft. Und dann sitzt der Hase im Pfeffer! :)

Fazit: Um deine Frage letzendlich noch zu beantworten ... Nimm eine Datenbank! Du wirst mit deinem jetzigen Kenntnisstand nicht in der Lage sein, eine Datei im parallelen Betrieb fehlerfrei zu lesen und zu schreiben, ohne dass in naher Zukunft eine Wettlaufsituation auftreten wird, die dir deine gesamten Daten zerstören wird.

Google am besten mal nach "mysql tutorial" ... damit kommst du dann hoffentlich weiter! :)

Kommentar von KieranMeow ,

Würden nur maximal 10 einträge auf einmal in der datei sein. Ich schau mal was ich anderes so finden kann. (Bin zu neu in PHP um selbst was zu basteln) Ich würde es mit ner datenbank machen, aber ich weiß nicht wie genau und ob das über php geregelt werden kann weil ich das über eine app mit dem MIT appinventor "steuern" möchte. in die Datei schreiben hab ich schon hinbekommen nur das löschen klappt nicht so ganz

Danke für die lange antwort.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten