phpBuddy

PHP und Sex

Was PHP und Sex gemeinsam haben? Beides sollte man niemals ohne ausreichenden Schutz praktizieren! Diese Rubrik gibt wichtige Tipps, wie man PHP gegen Attacken absichert und wie man sichere Scripts programmiert. Pflichtlektüre!

Sie sind hier: Startseite Die Standard PHP Library
SPL - Die Standard PHP Library - Zip-Dateien on-the-fly erstellen
Beitragsseiten
SPL - Die Standard PHP Library
Unser erstes Iterator-Beispiel
Mit Verzeichnissen arbeiten
Zip-Dateien on-the-fly erstellen
Backup Basis Script
Inhalte filtern
Fazit und Schlußwort
Alle Seiten

Zip-Dateien on-the-fly erstellen

Bevor wir mit den Iterator-Klassen weiter machen, wollen wir einen kurzen Abstecher zu einer anderen, sehr nützlichen, neuen Klasse in PHP 5 machen: ZipArchive

Mit der ZipArchive Klasse kann man auf eine wirklich sehr einfache Art und Weise Zip Dateien erstellen, verändern und auch wieder entpacken. Das erforderte früher mehr oder weniger komplizierte externe Klassen mit sehr viel Code, in denen nur die wenigsten verstanden was da eigentlich vor sich geht. Das ändert sich grundlegend mit PHP 5. Die Methoden dieser Klasse sind sehr intuitiv und einfach zu verstehen; hier ein Überblick der wichtigsten Methoden:

  • addEmptyDir() - Fügt einen leeren Ordner hinzu
  • addFile() - Fügt eine Datei hinzu
  • addFromString() - Fügt einen Datei aus Text hinzu
  • close() - Schließt eine offene Zip-Datei
  • extractTo() - Entpackt ein Archiv an eine bestimmte Position
  • open() - Öffnet eine Zip-Datei, bzw legt eine neue Zip-Datei an

Das ist nur ein kleiner Teil der Methoden der ZipArchive Klasse. Desweiteren stehen Methoden zur Verfügung um Kommentare anzufügen/auszulesen, Index und Namen zu verändern, usw. Schauen wir uns ein sehr einfaches Beispiel an, wie man mit sehr wenigen Zeilen Code eine Zip-Datei erstellen und auch wieder entpacken kann. Das kann sehr nützlich sein um Backups zu erstellen und wieder herzustellen.

Das Listing um eine neue Zip-Datei zu erstellen sieht wie folgt aus:

$zip = new ZipArchive;
$resource = $zip->open( 'testarchiv.zip', ZipArchive::CREATE );
if ($resource === TRUE)
{
    $zip->addFromString( 'test.txt', 'Hier steht ein beliebiger Text.' );
    $zip->addFile( 'testdateien/controller.php', 'config/controller.php' );
    $zip->addFile( 'testdateien/m3_saz.jpg', 'bilder/blindschleiche.jpg' );
    $zip->addFile( 'testdateien/whois.php', 'whois.php' );
    $zip->addFile( 'testdateien/whois.zip', 'whois.zip' );
    $zip->close();
}

In Zeile 1 erzeugen wir eine neue Instanz der ZipArchive Klasse. Anschliessend erstellen wir mit der Zeile

$resource = $zip->open( 'testarchiv.zip', ZipArchive::CREATE );

eine neue Zip-Datei und merken uns den Status (True oder False) von dem Vorgang. Wichtig hier ist der 2. Parameter in $zip->open(). Durch den Zusatz ZipArchive::CREATE teilen wir der Klasse mit, daß wir eine neue Zip-Datei erstellen möchten. Ohne diesen Zusatz würde die Klasse versuchen die Datei testarchiv.zip zu öffnen, was unweigerlich in einem Fehler endet, da diese Datei nicht existiert. Möchten wir hingegen eine bereits existierende Zip-Datei öffnen, weil wir z.B. Datei hinzufügen wollen, muß der Zusatz weggelassen werden, da sonst die Zip-Datei überschrieben wird!

Nachdem geprüft wurde ob die Datei erfolgreich angelegt wurde, fügen wird Dateien zu unserem Zip-Archiv hinzu. Als ersten benutzen wir $zip->addFromString() um eine Datei aus einer Variablen anzufügen. Wie wir sehen bestimmen wir als ersten Parameter den Dateinamen in der Zip-Datei und als 2. Parameter übergeben wir den String, bzw die Variable die den String beinhaltet.
Mit der Methode $zip->addFile() erweitern wir unser Zip-Archiv um weitere Dateien. Dabei stellt der erste Parameter die Quelldatei (ggfs mit Pfad) auf dem Server dar, während der 2. Parameter der Pfad und Dateiname in dem Archiv darstellt. Wie wir sehen können wir Pfad (Ordner-Struktur im Archiv) und Dateiname frei vergeben und müssen uns nicht an die Struktur auf dem Server halten. Sind alle Dateien hinzugefügt, wird das Archiv mit $zip->close() wieder geschlossen und unsere Zip-Datei ist fertig. Um Problemen mit Safe_Mode aus dem Weg zu gehen empfiehlt es sich, unmittelbar nach dem close() die Dateirechte mit CHMOD anzupassen.

Das entpacken einer Zip-Datei ist genauso einfach:

$zip = new ZipArchive;
if ($zip->open( 'testarchiv.zip' ) === TRUE)
{
    $zip->extractTo( 'testdateien/' );
    $zip->close();
}

Als erstes wieder ein neues Objekt von der ZipArchive Klasse erzeugen. In der if() wird geprüft ob das öffnen ($zip->open()) der Zip-Datei erfolgreich war. (Kein 2. Parameter wie beim erstellen!) Dann entpackt man den Inhalt aus der testarchiv.zip mithilfe der Methode $zip->extractTo() in den Zielordner, was in unserem Fall testdateien ist. Die geöffnete Datei mit $zip->close() schliessen und das war's! Kinderleicht, nicht wahr?!

Jetzt wo wir gesehen haben wie einfach es ist Zip-Dateien on-the-fly zu erstellen und wieder zu entpacken, kombinieren wir das mal mit den Fähigkeiten unseren DirectoryIterator Klassen.

Mal eine kleine Zwischenfrage: Was glaubst Du wie viele Zeilen Code wir brauchen um uns mithilfe der neuen ZipArchive Klasse und den Iterator Klassen der SPL ein Backup Script zu schreiben das uns ein Datei-Backup von unserer -sagen wir mal- 6-fach verschachtelte Verzeichnisstruktur erstellt? 25? 35? 50? mehr??

Fast, es sind ziemlich genau 7 Zeilen!