PHP-Datei soll sich selbst umschreiben

Hallo liebe Community,

bin gerade dabei ein Programm aus mehreren Dateien in eine zu packen, dazu müsste die Datei (PHP) sich selbst umschreiben.

Kleinigkeiten wie Text am Ende der Datei anhängen funktioniert.

<?php $datei = fopen("test.php","a"); $text = "test"; fwrite($datei, $text); fclose($datei); ?>

Jedoch, wenn sich die Datei in der Mitte selbst verändern soll müsste sie sich selbst in eine Variable laden und dann überschreiben, bisher ist mir dies noch nicht gelungen.

Versuche wie folgende funktionieren leider nicht, zumal sich die Anführungszeichen auch in die Quere kommen. (Wäre auch gelacht, wenn es einmal so einfach wäre.)

[code]$textinhalt = ’

$textinhalt = ’

'; // Dateiinhalt
$dateiname = “fragen_ohne_antworten.inc”; // Name der Datei
// Datei öffnen,
// wenn nicht vorhanden dann wird die Datei erstellt.
$handler = fOpen($dateiname , “a+”);
// Dateiinhalt in die Datei schreiben
fWrite($handler , $textinhalt);
fClose($handler);

'; // Dateiinhalt
$dateiname = “fragen_ohne_antworten.inc”; // Name der Datei
// Datei öffnen,
// wenn nicht vorhanden dann wird die Datei erstellt.
$handler = fOpen($dateiname , “a+”);
// Dateiinhalt in die Datei schreiben
fWrite($handler , $textinhalt);
fClose($handler);[/code]

Wie kann sich eine PHP-Datei beliebig selbst verändern?

Mit freundlichen Grüßen

MaxT :wink:

stichwort: output buffering

Stichwort: Blödsinn, das hilft nix, wenn man eine Datei ändern will

Warum willst du denn eine PHP-Datei verändern?

damit kann er doch die datei auslesen und dann den teil verändern, egal wo er steht, indem er den buffer in eine variable einließt und mit str_replace ändert, allerdings kann er das auch realisieren,indem er die datei einfach mit file_get_contents und str_replace.
danach die variable in die datei schreiben.

grüße,
sebastian

Mal abgesehen von Syntaxfehlern - was funktioniert denn nicht?

Eine Idee wäre erstmal das schrittweise zu machen - die neue
Version der Datei komplett in eine Variable speichern.
In einem ersten Schritt erzeugt man damit dann eine neue
Datei mit der Endung ‘.php’ und probiert dann, ob die geht.
Wenn das soweit in Ordnung ist, kann man ja den eigenen
Dateinamen überschreiben.
Ich vermute doch mal stark, daß das Skript während der Ausführung
komplett im Speicher ist und die Datei selbst nicht mehr gebraucht
wird. Sollte der parser das wirklich zeilenweise abarbeiten, kann es
da in der Tat zu Problemen kommen ;o)
Wenn letzteres der Fall sein sollte, müßte man nochmal über einen
Trick nachdenken - etwa erstmal eine temporäre Datei mit dem
neuen Inhalt anlegen, dann einen Verweis anbieten, um auf ein
zweites Skript zu wechseln, welche dann alt gegen neu tauscht.
Wenn die letzte Anweisung das Abspeichern ist, mag es ja auch
keine Probleme mit einer potentiellen zeilenweisen Abarbeitung
geben - kann allerdings sein, daß man das nicht mit einer Zeile
hinbekommt ;o)

Vielen Dank für die zahlreichen Antworten,

ich möchte die Datei verändern da diese eine Art Datenbank beinhaltet, diese muss erweitert werden.

Du hast recht, die Datei wird nicht benötigt, sie scheint sich doch selbst in einen Variable laden und verändern können. Die Befehle werden folglich nicht nur Zeilenweise abgearbeitet.

Allerdings hätte ich nun eine grundlegende Frage zu PHP. Was passiert wenn die Datei von wem anders aufgerufen wird während sie sich gerade selbst verändert? Erhält der zweite Besucher die alte Version oder lädt die Datei erst nachdem sie verändert wurde?

Mit freundlichen Grüßen

MaxT :wink:

Das kommt auf das „Locking“ an, bzw. darüber wäre das zu steuern.
Muss man allerdings selber implementieren - und hier hast du das Problem, dass nicht nur PHP im Spiel ist, sondern auch der Webserver; d.h. rein mit PHPs Locking-Mechanismus ist da nicht viel zu wollen*. Da müsstest du den neu zu schreibenden Teil also in eine eigene Datei auslagern, die ausschließlich von deinen PHP-Scripten gelesen wird, und nicht noch von anderen wie bspw. dem Webserver selbst - dann kannst du mit PHPs Locking-Mechanismus arbeiten.

Bei einer durchschnittlich besuchten Webseite hast du das Problem aber vermutlich gar nicht - die Wahrscheinlichkeit, dass zwei Zugriffe so exakt „gleichzeitig“ stattfinden, noch dazu bei vergleichsweise geringen Scriptlaufzeiten im Vergleich zum kompletten Request, ist verschwindend gering. Das „Schlimmste“, was eigentlich passieren kann, ist das entweder ein Besucher einen Scriptabbruch bekommt und dann den Request noch mal starten muss; oder dass der schreibende Prozess warten muss bzw. ggf. auch gar nicht schreiben kann, also dieser einen neuen Versuch starten muss.

Konzeptionell klingt das allerdings nach ziemlichem Murks - Script und Datenhaltung derart zu vermengen …

  • Obwohl ich mal Tests gemacht habe, mit dem Herunterladen einer sehr großen Datei, und dem parallelen Aufruf eines PHP-Scriptes, welches diese Datei löschen sollte - da hat das Script so lange mit dem Löschen „gewartet“, bis der Apache damit fertig war, die Datei komplett auszuliefern. Allerdings ist das so ein amateurhaftes Test-Szenario, dass ich dem nicht allzu viel Aussagekraft beimessen möchte.

Für sowas verändert man niemals die eigene Datei, das führt nur zu Problemen. Für sowas gibts MySQL-Datenbanken, Dateien, etc… Geschwindigkeitsvorteile bringt es auch kaum, wenn man die Datei vom PHP-Parser interpretieren lässt.

Viel Dank,

werde eine Datenbank mit den Werten füttern.

Liebe Grüße

MaxT :wink: