Am Ende der Seite finden Sie das komplette Beispiel als Download.
Die Sicherung von Dateien und ganzen Verzeichnissen sollte für Sie mindestens
genauso wichtig sein wie Ihr Internetprojekt selbst. Über die Sicherung von
Dateien, Verzeichnissen, Datenbanken oder Email-Postfächern
machen sich
viele erst dann Gedanken, wenn es zu spät ist. Dabei ist die Erstellung von
komprimierten oder archivierten Dateien gerade am Shell-Prompt
spielend
einfach.
Allerdings ist es notwendig, dass Sie den Unterschied zwischen einer komprimierten
und einer archivierten Datei kennen. Bei einer archivierten Datei
handelt es sich um eine Ansammlung von Dateien und Verzeichnissen, die in
die Archivdatei geschrieben wird.
Die Größe der Archivdatei entspricht dabei exakt der Größe aller in ihr gespeicherten
Dateien. Bei einer komprimierten Datei werden im Gegensatz zu einer
Archivdatei alle in ihr befindlichen Dateien komprimiert. Somit beansprucht
diese komprimierte Datei weniger Platz als alle in ihr befindlichen Dateien.
Sie fragen sich jetzt sicherlich, wofür Sie dann eigentlich eine Archivdatei
benötigen. Die Antwort ist recht simpel. Zuerst erstellen Sie eine Archivdatei
(TAR) mit allen Dateien und Verzeichnissen, um sie dann letztendlich mit Gzip
oder Bzip zu komprimieren.
Bevorzugt sollten Sie die Komprimierungstools Bzip2 und Gzip für die Komprimierung
nutzen, da sie auf den meisten Unix-Betriebssystemen
vorhanden sind.
Wollen Sie hingegen die komprimierte Datei zu einem Windows-Betriebssystem
übertragen, bietet sich hierfür das Komprimierungstool Zip an.
Achten Sie unbedingt immer darauf, dass Sie Befehle, die Sie über die Shell
ausführen, mit escapeshellcmd() maskieren. Sie gehen ein sehr hohes Risiko
ein, wenn Sie darauf verzichten, da dann willkürliche Befehle durch Benutzereingaben
ausgeführt werden können. In dem hier dargestellten Beispiel
wurde auf diesen Schutz verzichtet, da dem Skript keine Benutzereingaben
übergeben werden.
Außerdem konnten dadurch einige Schritte eingespart werden. Das folgende
Beispiel würde nicht funktionieren, wenn es zuvor mit espaceshellcmd()
maskiert worden wäre:
$shellBefehl = "tar cvf
$tarName $implodeFiles && gzip $tarName";
exec($shellBefehl,$var); |
Nach der Maskierung hätte unser Beispiel folgendermaßen ausgesehen:
$shellBefehl = "tar cvf
$tarName $implodeFiles \&\& gzip $tarName"; |
Dieses hätte zur Folge gehabt, dass zwar die Archivdatei erstellt worden
wäre, aber keine komprimierte Datei. Sie hätten bei einer Maskierung mit
espaceshellcmd() die beiden Befehle voneinander trennen müssen.
$shellBefehl = "tar cvf
$tarName $implodeFiles";
$shellBefehl_1 = "gzip $tarName";
exec($shellBefehl,$var);
exec($shellBefehl_1,$var_1); |
Eine Maskierung mittels espaceshellcmd() bei unserem Beispiel, in dem nur
*.sqlDateien
komprimiert werden sollen, wird auch so nicht funktionieren:
$files[] = ’testordnerSQL/*.sql’; |
Nach der Maskierung wäre unser Sternchen(*) maskiert, und die Aufgabe
könnte nicht erfüllt werden.
$files[] = ’testordnerSQL/\*.sql’; |
Sie sollten sich also bewusst sein, wann Sie etwas mit espaceshellcmd()
maskieren und wann nicht. Ein Skript, das keine Benutzereingaben übernimmt
und vielleicht hinter einen Verzeichnisschutz liegt (z. B. htaccess), ist relativ
sicher. Auch erreicht man eine enorme Sicherheit, indem alle übergebenen
Variablen überprüft werden.
Achten Sie im Vorfeld darauf, wie Sie den Pfad zu einer Datei oder zu einem
Verzeichnis angeben – das Ergebnis wird je nachdem, wie Sie den Pfad setzen,
ein anderes sein. Nehmen wir an, Ihr PHP-Skript
zum Komprimieren der
Dateien liegt im Verzeichnis
und Sie möchten die Dateien und das Verzeichnis
/home/user/htdocs/datei1.txt
/home/user/htdocs/datei2.txt
/home/user/htdocs/datei3.txt
/home/user/htdocs/verzeichnis1 |
komprimieren. Wenn Sie den absoluten Pfad (/home/user/htdocs) vor den
Dateio- der
Verzeichnisnamen setzen, werden die Verzeichnisnamen und auch
ihre Tiefe mit in die Archivdatei gespeichert. Je nachdem, was Sie mit der
Archivierung bezwecken, sollten Sie entweder den absoluten oder relativen
Pfad setzen.
Bei den folgenden Beispielen wurden insgesamt acht Dateien (reine Textdateien)
und zwei Verzeichnisse komprimiert. Anhand der folgenden Tabelle 8.1
können Sie ablesen, wie weit jeweils die möglichen Methoden
die Dateien komprimieren konnten. Gerade bei der Komprimierung von
Textfiles bietet sich Bzip2 wegen der blockweisen Komprimierung an – anhand
der Tabelle sehen Sie den enormen Unterschied zu den anderen Methoden.
Komprimierungstool |
|
Ursprungsgröße aller
Dateien |
|
Komprimierungsgröße
aller Dateien |
|
% |
Gzip |
|
ca. 880 kb |
|
30.55 kb |
|
96.53 |
Bzip2 |
|
ca. 880 kb |
|
9.53 kb |
|
98.91 |
Zip |
|
ca. 880 kb |
|
29.70 kb |
|
96.63 |
Tabelle 8.1: Unterschiedliche Komprimierungen
Zu den Beispielen in diesem Kapitel
Es kann passieren, dass nach Ausführen des Skripts keine Datei erstellt wurde.
Dies liegt dann wahrscheinlich daran, dass die erforderlichen Rechte für das
Verzeichnis in dem das Skript ausgeführt wurde, nicht richtig gesetzt sind und
angepasst werden müssen. Sie müssen dann die Rechte für das Verzeichnis
mit Ihrem FTP-Programm
folgendermaßen neu setzen:
- r Leserechte
- w Schreibrechte
- x Recht zum Ausführen
Abbildung 8.1: Rechte
Zurück zur Übersichtsseite
|