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 - Backup Basis Script
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

Die Kernfunktion unseres Datei-Backup Scripts

Ok zugegeben, das mit den 7 Zeilen war nicht leicht zu erraten, weil dazu eine weitere Iterator Klasse erforderlich ist die wir uns noch gar nicht angeschaut haben. Ebenso wurde auch noch nicht erwähnt das man Objekte einer Iterator Klasse beim Instanziieren einer anderen Iterator Klasse an diese übergeben kann, was den Umgang mit den Klassen wesentlich erleichtert und Schreibarbeit spart.

Das Listing des Backup Scripts zum erzeugen einer Zip Datei einer verschachtelten Verzeichnisstruktur:

$verzeichnis =  new RecursiveIteratorIterator(
                new RecursiveDirectoryIterator( 'testdateien/' ), true );
$zip = new ZipArchive;
$resource = $zip->open( 'backup.zip', ZipArchive::CREATE );
if ($resource === TRUE)
{
    foreach ( $verzeichnis as $datei )
    {
        $zip->addFile( $datei, $datei );
    }
}
$zip->close();

Im Prinzip ist das ganze Listing weitestgehend identisch mit dem Zip-Archiv Beispiel von eben. Einzig die erste Zeile ist etwas anders im Vergleich zu den vorherigen Beispielen, aber hier geschieht die eigentliche Arbeit. Aufgrund der Länge der Zeile habe ich sie umgebrochen um sie übersichtlicher zu machen. Werfen wir mal einen genaueren Blick darauf...

$verzeichnis =  new RecursiveIteratorIterator( new RecursiveDirectoryIterator( 'testdateien/' ), true );

Die innere Instanziierung der RecursiveDirectoryIterator Klasse ist nicht neu, das hatten wir weiter oben schon unter die Lupe genommen. Was hier jetzt aber neu ist, ist die Klasse RecursiveIteratorIterator der, bei dessen Instanziierung, das Object der RecursiveDirectoryIterator Klasse übergeben wird.
Wie wir oben gelernt haben, hat die RecursiveDirectoryIterator Klasse die Methoden hasChildren() und getChildren(), womit sich ermitteln lässt ob ein Verzeichnis weitere Unterverzeichnisse hat. Hier setzt die RecursiveIteratorIterator Klasse an, denn ganz offensichtlich erkennt diese Klasse selbstständig ob es Kinder gibt und beginnt ggfs die rekursive Iteration rekursive zu iterieren. (Geiler Satz, gelle?! :D) Hier ist eine kurze Übersicht der Methoden die dafür verantwortlich sind:

  • beginChildren()
  • beginIteration()
  • callGetChildren()
  • callHasChildren()
  • endChildren()
  • endIteration()
  • getDepth()
  • getInnerIterator()
  • getSubIterator()
  • nextElement()

Das True beim Aufruf könnte man in diesem Fall auch weg lassen, da es für das erstellen der Zip-Datei nicht erforderlich ist. Wird beim Aufruf True angegeben, wird auch der Name des Kindes (Unterverzeichnis) ausgegeben. Das kann nützlich und sinnvoll sein wenn z.B. eine Ordnerstruktur auf dem Screen ausgeben werden soll.

Schon beeindruckend wie einfach man so ein kleines Backup Script schreiben kann. Allerdings ist die Arbeitsweise doch etwas unbefriedigend. Das Script würde nämlich gnadenlos alles in die Zip-Datei packen was ihr auf dem Weg bei der rekursiven Iteration über den Weg läuft. Wirklich sinnvolle Backups kann man aber eigentlich nur dann machen, wenn wir bestimmte Dateien ausklammern könnten (z.B. htaccess Dateien, Log-Files, usw.) oder nur bestimmte Dateien in's Backup aufnehmen.
Wenn wir eins bis hierhin gelernt haben dann ist es, daß Verlaß auf die SPL ist. Wie nicht anders zu erwarten gibt es nämlich auch hier eine vorgefertigte Lösung und die heisst...