5.4 Archive_Tar 

Besprochene Version: 1.2 | Lizenz: PHP-Lizenz |
Klassendatei(en): Archive/Tar.php |
Die Klasse Archive_Tar ermöglicht es Ihnen, Tar-Archive, auch Tar-Balls genannt, neu zu erstellen oder die Daten aus einem bestehenden Archiv zu extrahieren. Hierbei handelt es sich nicht um ein Komprimieren, sondern nur um ein »Zusammenfassen« der Daten. Meist werden Tar-Archive aber noch zusätzlich im gzip- (Dateiendung .gz bzw. .tgz) oder bzip2-Format (Dateiendung .bz2) komprimiert, um Speicherplatz zu sparen. Das Paket unterstützt beide Kompressionsverfahren, wobei diese in der PHP-Installation vorhanden sein müssen.
Leider überprüft das Paket nicht alle Eventualitäten, wenn ein Zugriff auf Dateien erfolgt. So fängt das Paket beispielsweise nicht ab, wenn eine Datei, die archiviert werden soll, nicht gelesen werden kann o. Ä. Sie sollten also selbst sicherstellen, dass Ihr Programm auf dem Server über alle notwendigen Leserechte verfügt. Sollten die Schreibrechte fehlen, so dass ein Archiv nicht angelegt werden kann, bemerkt das Paket das.
Die Nutzung des Pakets gestaltet sich recht einfach. Nachdem Sie die Datei Archive/Tar.php eingebunden haben, können Sie ein neues Objekt instanziieren. Der Konstruktor bekommt den Namen der Archivdatei übergeben, mit der gearbeitet werden soll. Existiert die Datei nicht, wird sie neu angelegt. Eine bestehende Datei wird geöffnet. Als zweiten Parameter können Sie angeben, ob das Archiv komprimiert werden soll. Geben Sie "gz" an, wird das Archiv im gzip-Format komprimiert, wohingegen die Angabe von "bz2" eine Kompression im bzip2-Format forciert. Möchten Sie beispielsweise alle Dateien, die in einem Unterverzeichnis namens daten liegen, archivieren und die resultierende Datei komprimieren, könnte das so aussehen:
require_once("Archive/Tar.php"); // neues Archiv erzeugen $my_arc=new Archive_Tar("backup.tar.gz","gz"); // create bekommt den Namen des zu // komprimierenden Verzeichnisses uebergeben $my_arc->create("daten");
Der Dateiname, der dem Konstruktor übergeben wird, benötigt den vollen Dateinamen inklusive etwaiger Pfad-Angaben und Datei-Suffixe. Sollte ein Fehler bei der Ableitung des Objekts auftreten, weil z. B. eine Erweiterung zum Komprimieren der Daten nicht gefunden wird, bricht das Programm mit einer Fehlermeldung ab.
Die Methode create() bekommt den Namen eines Verzeichnisses, einer Datei als String oder die Namen von mehreren Verzeichnissen und/oder Dateien in Form eines Arrays übergeben. Mithilfe eines booleschen Werts, den sie zurückgibt, teilt sie mit, ob die Operation erfolgreich war. Wenn bereits eine (Archiv-) Datei unter dem Namen bestehen sollte, so wird diese überschrieben. Daher könnte es sinnvoll sein, dass Sie – bevor Sie die Datei überschreiben – mit file_exists() prüfen, ob der Dateiname bereits genutzt wird.
Ein wenig mehr Flexibilität bietet createModify(). Sie akzeptiert zwei weitere Parameter. Nach dem bzw. den Namen der Dateien oder Verzeichnisse, die hinzugefügt werden sollen, folgt der Name eines Verzeichnisses, in das die Daten eingefügt werden sollen. Beim Entpacken der Daten landen die archivierten Daten dann also in dem Unterverzeichnis, dessen Name hier angegeben wurde.
Möchten Sie Daten zu einem bestehenden Archiv hinzufügen, können Sie auf die Methode add() zurückgreifen. Bezüglich der Parameter verhält sie sich wie create(), nur überschreibt sie ein bestehendes Archiv nicht, sondern fügt die übergebenen Dateien hinzu. Sollte das Archiv noch nicht existieren, wird es automatisch angelegt. Auch hier gibt es wieder eine etwas leistungsfähigere Möglichkeit in Form von addModify(), das sich wie createModify() verhält.
Interessant ist auch die Methode addString(). Sie eröffnet Ihnen die Möglichkeit, eine Datei »on the fly« in das Archiv zu integrieren. Das heißt, dass Sie einen beliebigen String direkt als Text-Datei im Archiv ablegen können.
require_once("Archive/Tar.php"); // neues Archiv erzeugen $my_arc=new Archive_Tar("backup.tar.gz","gz"); $my_arc->addString ("daten","Peter Sausewind");
In diesem Beispiel würde das komprimierte Archiv backup.tar.gz eine Datei namens daten enthalten. In dieser Datei ist dann der Text Peter Sausewind enthalten, wenn das Archiv wieder entpackt wird. Diese Methode kann wirklich sehr hilfreich sein, wenn Sie beispielsweise Daten aus einer Datenbank ausgelesen haben und diese in einem Archiv ablegen wollen.
Natürlich kann das Paket nicht nur packen, sondern auch entpacken. Um den Inhalt eines Pakets auszugeben, steht Ihnen die Methode listContents() zur Verfügung. Sie liefert ein Array zurück, in dem für jede einzelne Datei ein weiteres Array vorgesehen ist. Bei diesem verschachtelten Array handelt es sich um ein assoziatives Array. Die wichtigsten Schlüssel des Arrays finden Sie in Tabelle 5.3.
Um ein Archiv zu entpacken, ist die Methode extract() vorgesehen, die die Daten so wiederherstellt, wie es im Archiv vorgesehen ist. Sie legt also alle Dateien und Unterverzeichnisse entsprechend der Vorgaben an oder überschreibt bereits existierende Dateien. Sie können der Methode zusätzlich den Namen eines Directorys übergeben, in das die Daten entpackt werden sollen. Auch diese Methode gibt ein false zurück, wenn ein Fehler auftreten sollte.
Teilweise weisen die Dateien, die in einem Tar-Ball zusammengefasst sind, eine recht tiefe Verzeichnisstruktur auf. Das heißt, eine Datei daten.dat wurde beim Erstellen des Archivs beispielsweise direkt aus dem Unterverzeichnis public_html/daten/backup ausgelesen. Beim Entpacken würde der komplette Pfad wieder hergestellt, was sehr störend sein kann. Möchten Sie das verhindern, können Sie die Daten mit extractModify() entpacken. Diese Methode akzeptiert noch einen zweiten Parameter, mit dem Sie den Pfad angeben können, der entfernt werden soll. Mit
würden die Daten aus dem Archiv in das Verzeichnis restore entpackt, und der Pfad public_html/daten/backup würde automatisch entfernt.
Eine letzte sehr hilfreiche Methode beim Extrahieren von Daten ist extractInString(). Ähnlich wie bei addString() ermöglicht Ihnen diese Methode, Daten direkt in einen String zu übernehmen. Die Methode bekommt den Namen einer Datei übergeben, die in dem Archiv enthalten ist. Diese Datei wird entpackt, und ihr Inhalt wird als String zurückgegeben. Die Zeile
würde also die Datei daten.dat entpacken und die dort enthaltenen Daten als String in der Variable $datei ablegen.