FTP-Sicherung bequem per PHP-Skript erledigen

Vergangene Woche habe ich hier auf meinem Blog zwei simple Sicherungsskripte für MySQL-Datenbanken zur Verfügung gestellt. Neben regelmäßigen MySQL-Backups solltest du auch die Daten auf deinem Webspace sichern. Da dieser Prozess bei mir bisher ebenfalls manuell erfolgte und mich das genauso störte, musste für die Aufgabe ein PHP-Skript her. Im Grunde ist die Erstellung eines Sicherungsarchives eine einfache Geschichte. Solange die Speichergröße gering bleibt.

Sicherung ist das halbe Leben (Quelle: William Hook, Liz. CC BY-SA 2.0)
Sicherung ist das halbe Leben (Quelle: William Hook, Liz. CC BY-SA 2.0)

Reden wir über ein Backup, welches mehrere 100 MB umfasst, schaut die Welt ein klein wenig anderes aus. Das Skript soll also auch bei großen Sicherungen nicht versagen und mir das Archiv als Download anbieten. Anschließend soll die Sicherung in einen Ordner, außerhalb der Weboberfläche, verschoben werden.

Bevor du das Skript verwenden kannst, prüfe bitte, ob dein Webserver das Pear-Paket Archive_Tar unterstützt. Falls nicht, musst du es nachrüsten. Ansonsten kann das Skript keine Archive erstellen. Die Variablen $root und $backup_dir solltest du entsprechend deiner Infrastruktur anpassen. Das Skript bietet die Möglichkeit, Dateien und Ordner aus der Sicherung auszuschließen. Das kann sinnvoll sein, wenn du beispielsweise Logs oder Ähnliches auslassen möchtest.

<?
/**
* FTP Backup Script
* Copyright (c) 2015 GFX-Stylez.blog
* Creative Commons Attribution, Share-Alike.
*
*/
    // PHP-Konfiguration anpassen
    @error_reporting(E_ALL ^ E_WARNING);
    @ini_set("max_execution_time", 0);
    set_time_limit(0);
    // Root-Pfad festlegen und Sicherungsverzeichnis erstellen
    $date = date('ymd');
    $root = "/www/htdocs/.../";
    $backup_dir = $root."backups/FTP/".$date."/";
    mkdir($backup_dir, 0755);
    $archivname = "FTP-Backup-".$date.".tar.gz";
    include "Archive/Tar.php";
    // Dateien oder Ordner aus der Sicherung ausschließen
    $ignore = array("*.sql.gz", "Ordner");
    // FTP-Sicherung durchführen
    $archiv = new Archive_Tar($archivname, true);
    $archiv->setIgnoreList($ignore);
    $archiv->createModify($root, $accountname, $root);
    // FTP-Sicherung herunterladen
    header('Content-type: application/x-tar');
    header('Content-Disposition: inline; filename="' . $archivname . '"');
    header('Content-Transfer-Encoding: binary');
    header('Accept-Ranges: bytes');
    header('Content-Length: '.filesize($archivname));
    ignore_user_abort(true);
    $f = @fopen($archivname, "r");
    while(!feof($f)){
        print(@fread($f, 1024*8));
    }
   @fclose($f);
    // Sicherung verschieben
    if ($f){
        rename($archivname, $backup_dir.$archivname);
    }
?>

Ich stelle das Skript hier zur freien Nutzung bereit, übernehme aber keinerlei Haftung dafür. Du bist für den Einsatz also selbst verantwortlich. Die Lösung ist auf meinen Webserver zugeschnitten. Weitere Anpassungen des Skripts sind daher für deine Umgebung natürlich denkbar. Falls du Verbesserungsvorschläge hast, kannst du mir diese gern per Mail oder Kommentar mitteilen.

Update 03.09.2015 — 8:30: Ich habe an meinem Backup-Skript noch ein paar kleine Änderungen vorgenommen, da der Download bei zu großen Backups (über 700 MB) oft fehlschlug. Die Funktionen ob_flush(); und flush(); wurden entfernt. Der Vollständigkeit halber habe ich noch ein @fclose($f); angefügt.


Avatar von reraiseace
Autor: Markus Werner (reraiseace) Twitterreraiseace, Google+reraiseace, Twittercb_werner
Ich bin Redaktionsvolontär bei der COMPUTER BILD in Hamburg, Fernstudent am Deutschen Journalistenkolleg und schreibe auf re{raise}ace privat über Webdesign und Programmierung. Seit 2015 schrieb ich auch regelmäßig für andere Medien.

0 Kommentare – Schreib mir deine Meinung!

Fülle bitte die nachstehenden Felder aus. Angaben mit einem Sternchen sind Pflichtangaben. Deine E-Mail-Adresse wird nicht veröffentlicht.