stefankittel
Goto Top

PHP - Eigene Datei unter dem Hintern löschen und neu erstellen?

Hallo,

ich arbeitet gerade an einem kleinen Skript in PHP für einen Kunden.
Das Skript besteht aus ca. 6 Dateien. wovon aber nur eine aufgerufen wird.

Dieses soll verteilt auf vielen Webserver laufen und dort per Cron die index.php aufgerufen werden.
Die System sind gemischt von Apache2 zu Nginx und IIS. FPM/FCGI.
Soweit so einfach.

Da wir aber keinen Zugriff auf die Seiten haben benötigen wir einen Updater.
Dabei ergeben sich zwei Problem zu denen mit Onkel Google nichts sinnvolles aufgelistet hat.

1. Ich habe keine Möglichkeit den Updater aufzurufen und der Kunde wird es nicht machen.
2. Ich benötige auch einen Updater für den Updater. Egal wie schlau zu sein man meint....

Fragen:
Wie wird PHP ausgeführt?
Wieviel lädt er von einer php-Datei in den Arbeitsspeicher?

Bzw. kann ich in der Datei index.php diese selber einfach löschen und neu beschreiben für den nächsten Aufruf?
Z.B. bei Windows-Scripten fällt er bei sowas voll auf die Nase und führt an der alten Stelle den nächsten Befehl aus der neuen Datei aus.

Ich habe es mal mit php ausprobiert und es hat funktioniert.
Aber kann ich mir sicher sein, dass es immer geht? Vieleicht geht es nur bis 64k oder so.

Eigentlich benötige ich Drei Dateien und damit auch 3 crons um auf der sicheren Seite zu sein.
Update1.php löscht die update2.php und lädt sie neu runter
Update2.php überprüft das Programm und lädt die neuen Programteile runter
index.php ist das eigentliche Program.

Vermutlich kann aber z.B. index.php das machen.
index.php prüft ob es ein Update gibt.
Löscht update.php, lädt dies neu runter, includiert update.php und exit

Hat da Jemand verlässliche Informationen zu?

Danke

Stefan

Content-ID: 271501

Url: https://administrator.de/contentid/271501

Ausgedruckt am: 23.11.2024 um 14:11 Uhr

114757
114757 09.05.2015 aktualisiert um 10:07:15 Uhr
Goto Top
Moin Stefan,
also ich würde da zwei Files her nehmen einmal die Index.php und eine Update.php. Mit der letzteren prüfst du mit cron regelmäßig eine URL in der die Informationen für ein mögliches Update stehen und lädst dann die neue Index.php herunter und ersetzt die vorhandene damit. Zusätzlich prüfst du in der Index.php eine URL ob es Updates für den Updater gibt und ersetzt dem entsprechend die update.php. Sollte meiner Meinung nach eigentlich reichen oder ?

Gruß jodel32
Lochkartenstanzer
Lochkartenstanzer 09.05.2015 aktualisiert um 18:33:01 Uhr
Goto Top
Moin,

Ich würde es über eine Hilfsdatei + rename implementieren:

  • datei-alt erstellt die Hilfsdatei zm umbenennen und die neue datei.
  • ruft die hilfsdatei auf, ggf mit einem parameter der angibt, ob dei neue datei anschließend aufgerufen werden soll.
  • Hilfsdatei bewegt die alte datei weg und schreibt die neue datei an die ursprüngliche stelle.
  • ggf. wird neue (oder alte datei) mit Parameter aufgerufen, der sagt, wie weit man gekommen ist.

lks

Nachtrag: Hätte den Vorteil, daß man im fall des falles ggf auf die vorherige version "zurückmoven" könnte.
LordGurke
Lösung LordGurke 10.05.2015, aktualisiert am 11.05.2015 um 12:50:17 Uhr
Goto Top
Grundsätzlich zu deiner Eingangsfrage:

Unter Linux-Systemen (und danach hört es sich an) kann eine Datei, die bereits geöffnet ist, immer umbenannt, verschoben oder gelöscht werden. Solange sie geöffnet ist, wird der Zugriff weiter funktionieren.
Zusätzlich lädt PHP immer die gesamte Datei in den RAM - schon alleine, um die Syntaxprüfung zu machen. Ist die Datei einmal im RAM, kannst du sie beliebig verändern - erst bei einem erneuten Aufruf wird dann die neue Datei geladen.
Lochkartenstanzer
Lochkartenstanzer 10.05.2015 um 12:40:08 Uhr
Goto Top
Zitat von @LordGurke:

Zusätzlich lädt PHP immer die gesamte Datei in den RAM - schon alleine, um die Syntaxprüfung zu machen. Ist die
Datei einmal im RAM, kannst du sie beliebig verändern - erst bei einem erneuten Aufruf wird dann die neue Datei geladen.

Trotzdem würde ich empfehlen, eine neue Datei zu erzeugen, und dann die alte und neue Datei umzubenennen oder die alte durch die neue zu ersetzen. Erspart Probleme, wenn das Skript im falschen Moment abgebrochen wird.

lks
dog
Lösung dog 10.05.2015, aktualisiert am 11.05.2015 um 12:50:14 Uhr
Goto Top
Wie wird PHP ausgeführt?

PHP wird seit Version 4 kompiliert und als VM-Bytecode ausgeführt (davor wurde es interpretiert).
Zu dem Zeitpunkt wo das Skript ausgeführt wird, ist also die ursprüngliche Source-Datei völlig egal.
Allerdings sollte man bedenken, dass durch include/require weitere Dateien zu beliebigen Zeitpunkten nachgeladen werden können.

Und so ein Self-Update hat ja mittlerweile jede größere PHP-Anwendungen (z.B. Wordpress, Piwik, ...) implementiert.
Du könntest natürlich auch einfach git/svn benutzen...
StefanKittel
StefanKittel 11.05.2015 um 12:53:04 Uhr
Goto Top
Danke allen zusammen,
So hatte ich es mir schon gedacht.
Meine Tests haben das Gleiche ergeben.

Ich mache es nun so, dass die index.php nur ein Loader ist. Keine Inlcudes.
Diese prüft ob es ein Update gibt. Wenn ja, lädt er die update.php runter, dann ein require und direkt danach ein exit.
Sonst ein require auf die main.php und dann ein Exit.
Selbst wenn was schiefgeht fehlt ihm nur das Exit.

Viele Grüße

Stefan