Systemvoraussetzung
- Linux
- PHP 4 >= 4.2.0
- PHP 5
- TAR
- GZIP
Datei(en)
wget.php
Problem
Sie kennen sicher das Problem: Sie wollen Ihr neues Forum oder eine Administrationssoftware
für Ihre Datenbank installieren, und alleine der Upload aller
Dateien von Ihrem lokalen Rechner auf den Server dauert eine Ewigkeit. Anhand
des Datenbankadministrationstools phpMyAdmin kann man sehr schön
darstellen, wie häufig vorgegangen wird.
- Download der gepackten Software von der Homepage
- Auf dem eigenen Clientrechner entpacken
- Per FTP alle entpackten Dateien zum Server hochladen.
Diese Vorgehensweise ist immer noch stark verbreitet. Je nach Geschwindigkeit
kann dieser Weg aber sehr lange dauern. In der Regel geht zwar der Download
sehr schnell, dafür zieht sich der Upload umso länger.
Denn die Uploadgeschwindigkeit ist in der Regel sehr viel kleiner als beim
Download. Zudem müssen Hunderte von Dateien per FTP hochgeladen und
einzeln geprüft werden. Als Beispiel soll hier wieder phpMyAdmin herhalten.
Der komplette Inhalt von phpMyAdmin umfasst insgesamt ca. 620 Dateien
und Verzeichnisse.
Dieser Vorgang kann schon mal gute 20 bis 30 Minuten dauern! Stellen Sie sich
aber vor, wie viel Zeit Sie sich sparen, wenn Sie den ganzen Prozess in noch
nicht einmal 10 bis 20 Sekunden erledigen könnten. Das folgende Beispiel
zeigt, wie es geht.
Lösung
Die Lösung heißt wget! Dabei laden wir erst gar nicht die Software auf unseren
Clientrechner, sondern direkt von der Downloadseite des Anbieters auf unseren
Server im Internet. Dieser Vorgang dauert nicht einmal 10 bis 15 Sekunden.
Danach entpacken wir direkt die Datei und können die eigentliche Installation
wie gewohnt ausführen.
Sie können das nachfolgende Beispiel ohne weiteres so umschreiben, dass es
auch für PHP3 funktioniert. Sie müssen dafür folgende Funktionen austauschen:
- md5_file(), PHP 4 >= 4.2.0, PHP 5
- escapeshellarg(), PHP 4 >= 4.0.3, PHP 5
Anstelle von md5_file() könnten Sie die Datei mit fread() einlesen und
mit md5() testen. escapeshellarg() könnten Sie gegen escapeshellcmd()
ersetzen.
Sie könnten das Programm auch so umschreiben, dass Sie es mit einem Webformular
nutzen können, statt wie hier beschrieben nur im Quellcode. Sie sollten
dann aber darauf achten, dass Sie die Datei hinter einen Verzeichnisschutz
stellen. Im Kapitel „Verschlüsselung/Prüfsummen“ finden Sie ein Programm,
das auch dieses Problem sehr schnell und einfach für Sie erledigt.
Wir geben zuerst den kompletten http-Link
(26) zu der Datei ein, die wir
downloaden möchten. Wir benötigen weiterhin den reinen Dateinamen der
Datei (28), da wir diesen für die MD5-Prüfsumme
und den Entpackvorgang
benötigen. Sie könnten hier auch eine Routine hinzufügen, die den Dateinamen
aus der URL extrahiert.
In der Regel bieten Anbieter von Softwareprodukten eine MD5-Prüfsumme
(30)
bei ihrem Download mit an. Diese Summe soll sicherstellen, dass es sich um
die originale Datei handelt und nicht um eine geänderte Version.
Weiterhin kann man an dieser Prüfsumme bei der Überprüfung feststellen,
ob die herunter geladene Datei wirklich vollständig übertragen wurde. Wir erstellen
nach dem Download eine eigene MD5-Prüfsumme
(40) und vergleichen
(40) diese mit der Prüfsumme des Anbieters (30). Sind beide Werte identisch,
handelt es sich um die Original-Datei
und wurde vollständig übertragen.
Man sollte niemals ungeprüfte Formulardaten an die Shell übergeben (34), da
dies ein sehr hohes Sicherheitsrisiko darstellt. Mit escapeshellarg() werden
solche Variablen maskiert, damit keine ungewollten zusätzlichen Befehle ausgeführt
werden können. Hier im Beispiel bräuchten wir das eigentlich nicht, da
wir keine Daten übergeben bekommen.
Im nächsten Schritt übergeben wir mit exec() (34) den Shell-Befehl
wget mit
unserer Download-URL
an die Shell, die daraufhin den Download startet und
die Datei im gleichen Verzeichnis wie die ausgeführte PHP-Datei
speichert.
Die Prüfsumme der Datei müssen Sie nicht berechnen, ich rate Ihnen aber
dazu. Wir setzen zuerst die Variable für den Check (38) auf FALSE, also dass
ein Fehler aufgetreten ist. Falls die Variable der Prüfsumme (30) nicht leer
sein sollte, so überprüfen wir (40) die Variable mit der MD5-Prüfsumme
der
gerade herunter geladenen Datei. Sind sie identisch (40), so setzen wir unsere
Variable für den Check auf TRUE (41), ansonsten geben wir einen Fehler aus.
Falls die Variable der Prüfsumme (30) leer war, können wir direkt unsere Variable
für den Check auf TRUE (47) setzen, da wir keine Überprüfung vornehmen
müssen.
Im letzten Schritt müssen wir die gerade geholte Datei entpacken. Dafür
bereiten wir den Befehl zum Entzippen vor (53), maskieren (54) ihn wieder,
um ihn dann anschließend mit exec() an die Shell zu übergeben (56). Als
Rückgabewert erhalten wir eine Auflistung aller entpackten Dateien.
Sie können jetzt wie gewohnt die Installation fortsetzen. Falls es sich bei der
downloadbaren Datei nicht um eine GZIP-Datei
handelt, sondern vielleicht um
eine BZIP2- oder
ZIP-Datei,
lesen Sie im Kapitel "Komprimieren/Archivieren/Backups" nach.
Dort finden Sie alle Möglichkeiten, um mit solchen Dateien ebenfalls spielend
umgehen zu können. Zudem finden Sie in diesem Kapitel weitere Informationen
zum Thema Zippen/Entzippen. 26:
27:
28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60:
| $fileURL = "http://umn.dl.sourceforge.net/sourceforge/phpmyadmin/
phpMyAdmin-2.8.0.3.tar.gz";
$fileName = "phpMyAdmin-2.8.0.3.tar.gz";
$md5Check = "1ca0b652e39010d906e3ea3a02fb9d82";
$escape = escapeshellarg($fileURL);
exec("wget " . $escape);
$unzip = FALSE;
if(!empty($md5Check)){ if(md5_file($fileName) == $md5Check) $unzip = TRUE; else echo "Checksummen stimmen nicht überein!";
} else { $unzip = TRUE; }
if($unzip) { $shellBefehl = "tar -xzvf $fileName"; $shellBefehl = escapeshellcmd($shellBefehl);
exec($shellBefehl,$nu);
print_r($nu); } |
Ausgabe im Browser (verkürzte Darstellung)
Array
(
[0] => phpMyAdmin2.8.0.3/
[1] => phpMyAdmin2.8.0.3/Documentation.txt
[2] => phpMyAdmin2.8.0.3/CREDITS
[3] => phpMyAdmin2.8.0.3/ChangeLog
:
:
:
[614] => phpMyAdmin2.8.0.3/themes/original/img/vertical_line.png
[615] => phpMyAdmin2.8.0.3/themes/original/info.inc.php
[616] => phpMyAdmin2.8.0.3/themes/original/layout.inc.php
[617] => phpMyAdmin2.8.0.3/themes/original/screen.png
) |
Wie Sie gesehen haben, wurde das Problem mit wenigen Zeilen Programmcode
gelöst und Sie müssen nur noch eventuelle Konfigurationseinstellungen in
Ihrem neuen Programm anpassen.
Dieses Skript aus dem SELFPHP KOCHBUCH wurde von SELFPHP unter dem "Tarif Mc500" von McAc.net-Webhosting erfolgreich ausgeführt und getestet!
Auf der Übersichtseite unter "McAc.net – Webhosting zu diesem Buch" finden Sie weitere Informationen zu dem Webhostingpaket, dass durch SELFPHP getestet wurde.
|