PEAR-Forum.de Übersicht Thema anzeigen - [HowTo] Backup mit Archive_Tar und HTTP_Download

[HowTo] Backup mit Archive_Tar und HTTP_Download


 

PEAR-Forum.de Übersicht » HowTo´s, Tutorials, Codebeispiele und Wissenswertes
Neues Thema eröffnen Neue Antwort erstellen Diesen Beitrag ausdrucken
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
MaGdev
Site Admin


Anmeldungsdatum: 04.02.2004
Beiträge: 715
Wohnort: Hamburg

Beitrag10.06.2005 19:36    [HowTo] Backup mit Archive_Tar und HTTP_Download Antworten mit Zitat

Die benötigten PEAR-Klassen finden Sie hier:

Archive_Tar
HTTP_Download


Verzeichnisse in Archiv sichern
Für die Klasse Archive_Tar benötigen wir zunächst den Inhalt des gewünschten Verzeichnisses als Array (oder als String, in dem die einzelnen Dateinamen durch ein Leerzeichen getrennt sind). Von Archive_Tar werden sowohl Dateinamen, als auch Verzeichnisnamen akzeptiert. Alle in den Verzeichnissen enthaltenen Dateien werden beim packen des Archivs berücksichtigt, so das wir die Verzeichnisse nicht rekursiv durchlaufen müssen.

Zum Einlesen der Dateien und Verzeichnisse schreiben wir eine Funktion mit den üblichen PHP-Befehlen.

PHP:
<?php
  
// Funktion: Verzeichnis einlesen
  // Gibt die Datei- und Verzeichnisnamen als Array zurück
  
function getDirList($path)
  {
    if(
is_dir($path))
    {
      
$files=array();
      
$handle=opendir($path);
      while(
$file=readdir($handle)) 
      {
         
// ./, ../, backups/ ausschliessen
         
if($file!="." && $file!=".." && $file!="backups")
         {
           
$files[]=$path.$file;
         }
       }
       
closedir($handle); 
       return 
$files;
     } else {
       return 
false;
     }
   }
?>


Als nächstes benötigen wir die Pfade zu den Quelldateien und -verzeichnissen, zum Verzeichnis, in dem unser Archiv gesichert werden soll und wir benötigen den gewünschten Dateinamen des Archivs. Diese entnehmen wir einem HTML-Formular.

PHP:
<?php
// Verzeichnis, welches gesichert werden soll
// Windows-Pfade (Backslash,\) werden automatisch in Linux-Pfade (Slash./) umgewandelt
// Wenn kein abschliessender Slash da ist, wird einer angefügt
$path=trim(str_replace("\\","/",$_POST['source'])); 
$path=substr($path,strlen($path)-1,1)=="/"?$path:$path."/";
    
// Speicherpfad des Tar-Files
$save_path=$path."backups/"
    
// Falls backups/-Verzeichnis nicht existiert, erstellen
if(!is_dir($save_path)){mkdir($save_path,0755);}
    
// Dateiname des Tar-Files
$tar_file=trim($_POST['filename']).trim($_POST['format']);
?>


Jetzt ist alles bereit, das Archiv zu erstellen.

PHP:
<?php
// Verzeichnisinhalt einlesen
$files=getDirList($path); 
    
// Tar-File erstellen
if(is_array($files))
{
  switch(
trim($_POST['format']))
  {
    case 
".tar"$t=NULL; break;
    case 
".tar.bz2"$t="bz2"; break;
    case 
".tgz"$t="gz"; break;
    case 
".tar.gz"$t="gz"; break;
  }
  
// Archive_Tar instanzieren
  
$tar = &new Archive_Tar($tar_file,$t);
        
  
// Tar-Archiv erstellen
  
$tar->createModify($files,'',$path);  // Ohne Pfad speichern
  // Tar-Archiv erstellen
  //$tar->createModify($files,'root',$path); // Mit root/ speichern
  // Tar-Archiv erstellen
  //$tar->create($files); // mit vollständigen Pfaden speichern
        
  // "Destructor" aufrufen
  
$tar->_Archive_Tar(); 
}
?>


Als erstes lesen wir den Verzeichnisinhalt des Quellverzeichnisses ein und überprüfen die Rückgabe auf den richtigen Datentyp.

Dann prüfen wir das gewünschte Dateiformat aus der Formularübergabe. Wir haben die Möglichkeit, der Archive_Tar-Klasse einen Parameter für die Komprimierung übergeben. Dabei ist für ein einfaches Tar-Archiv einfach NULL (oder gar nichts) zu übergeben, für GZip-Komprimierung die Zeichenkette gz oder für bzip-Komprimierung der String bz2.

Jetzt können wir Archive_Tar instanzieren. Dabei übergeben wir das Array mit dem Verzeichnisinhalt und die gewünschte Komprimierung.
Zur Erstellung des Archivs haben wir jetzt im Wesentlichen zwei Methoden zur Auswahl: create() erstellt das Archiv mit den absoluten Pfaden zu den enthaltenen Dateien, bei Windows-Versionen wird der Laufwerksbuchstabe extrahiert. Bei der zweiten Methode, createModify(), haben wir die Möglichkeit, die gespeicherten Pfade zu beeinflussen. Der Methode wird als erstes das Array mit dem Verzeichnisinhalt übergeben. Als zweiten Parameter können wir einen Pfad angeben, der vor die absoluten Pfade gesetzt wird. Als dritten Parameter kann ein Teil des Archiv-Pfades entnommen werden. Dabei wird die Entnahme vor dem Hinzufügen ausgeführt.
Abschliessend rufen wir noch den Archive_Tar-eigenen Destructor auf.

Damit liegt unsere Gepackte Datei auf dem Server. Jetzt müssen wir nur noch, je nach Parameter die Datei kopieren und zum Download als Dateistream senden. Hierfür sind nur wenige Zeilen Code notwendig:

PHP:
<?php
if(trim($_POST['server'])==true)
{
  
// Datei kopieren
  
copy($tar_file,$save_path.$tar_file);
}

if(
$_POST['dl']==true)
{
  
// Datei als Download senden
  
HTTP_Download::staticSend(array('file'=>$tar_file));
}

// Datei löschen
unlink($tar_file);
?>


Das Kopieren der Datei erledigen wir mit dem PHP-Befehl copy().

Um die Datei zum Download anzubieten, benötigen wir nur eine einzige Zeile. Dabei rufen wir die statische Methode staticSend() der Klasse HTTP_Download auf. Als Parameter erwartet die Methode ein Array mit den entsprechenden Daten. Die genaue Struktur des Arrays entnehmt ihr der PEAR-Klasse selber.

Zu guter letzt löschen wir unsere Archivdatei, da wir sie ja entweder heruntergeladen oder auf dem Server gespeichert haben - oder beides.

So, das wars!

_________________
Auch der längste Weg beginnt immer mit einem kleinem Schritt!

Vorgehen bei Problemen:
1. PHP-Handbuch oder PEAR-Handbuch lesen!
2. Forensuche benutzen!
3. Fragen posten und dabei die Regeln beachten!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Diese Seite übersetzen
PEAR-Forum.de Übersicht » HowTo´s, Tutorials, Codebeispiele und Wissenswertes
Neues Thema eröffnen Neue Antwort erstellen Diesen Beitrag ausdrucken
   Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

Zu Deinen Favoriten hinzufügen

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen