In der heutigen digitalen Welt ist die Sicherung von Daten eine wesentliche Aufgabe für jeden Webmaster oder Entwickler. Datenverlust kann katastrophale Folgen haben, sei es durch Hardwareausfälle, Cyberangriffe oder menschliches Versagen. Um dem entgegenzuwirken, stellen wir ein robustes und benutzerfreundliches PHP-Skript vor, das MySQL-Datenbanken und Verzeichnisse sichert und in einer verschlüsselten ZIP-Datei speichert. Das Beste daran? Dieses Skript ist kostenlos unter der GNU General Public License (GPL) verfügbar.

Funktionen des PHP-Backup-Skripts

  1. MySQL-Datenbank-Backup
    Dieses Skript erstellt einen vollständigen SQL-Dump Ihrer MySQL-Datenbank, einschließlich aller Tabellen und Daten.
  2. Verzeichnis-Backup
    Zusätzlich zur Datenbank können Sie ein gesamtes Verzeichnis mit allen Dateien und Unterordnern sichern.
  3. Verschlüsselte ZIP-Dateien
    Die Backups werden in einer verschlüsselten ZIP-Datei gespeichert, um die Sicherheit Ihrer Daten zu gewährleisten.
  4. Automatisierte Backups
    Dank PHP können Sie dieses Skript problemlos in Ihre bestehenden Systeme integrieren und automatisierte Backups einrichten.

Verwendung des Skripts

Das PHP-Backup-Skript ist einfach zu bedienen. Nachfolgend finden Sie eine detaillierte Anleitung zur Implementierung und Ausführung des Skripts:

  1. PHP- und MySQL-Verbindungsdaten anpassen
    Passen Sie die MySQL-Verbindungsdaten ($host, $user, $password, $database) und den Pfad zu dem Verzeichnis, das gesichert werden soll ($directoryToBackup), an.
  2. Zielverzeichnis und Passwort festlegen
    Geben Sie das Zielverzeichnis für das Backup ($backupDir) und das Passwort für die ZIP-Verschlüsselung ($zipPassword) an.
  3. Skript ausführen
    Speichern Sie das Skript in einer PHP-Datei und führen Sie es aus.
<?php
/**
 * Erstellt ein Backup einer MySQL-Datenbank und eines Verzeichnisses und speichert es in einem verschlüsselten ZIP-Archiv.
 *
 * @param string $host MySQL Hostname
 * @param string $user MySQL Benutzername
 * @param string $password MySQL Passwort
 * @param string $database MySQL Datenbankname
 * @param string $directoryToBackup Pfad zu dem Verzeichnis, das gesichert werden soll
 * @param string $backupDir Pfad zu dem Verzeichnis, in dem das Backup gespeichert werden soll
 * @param string $zipPassword Passwort für die ZIP-Verschlüsselung
 * @license https://www.gnu.org/licenses/gpl-3.0.de.html
 */
function createBackup($host, $user, $password, $database, $directoryToBackup, $backupDir, $zipPassword)
{
    // Aktuelles Datum im ISO-Format
    $date = date('Y-m-d');

    // ZIP-Dateiname
    $zipFileName = $backupDir . '/backup_' . $date . '.zip';

    // MySQL-Dump-Datei
    $sqlDumpFile = $backupDir . '/backup_' . $date . '.sql';

    // Erstelle eine Verbindung zur MySQL-Datenbank
    $mysqli = new mysqli($host, $user, $password, $database);

    if ($mysqli->connect_error) {
        die('Verbindungsfehler (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
    }

    // Erstelle den SQL-Dump
    createSqlDump($mysqli, $sqlDumpFile);

    // Schließe die MySQL-Verbindung
    $mysqli->close();

    // Initialisiere das ZIP-Archiv
    $zip = new ZipArchive();
    if ($zip->open($zipFileName, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== TRUE) {
        die('Fehler beim Erstellen der ZIP-Datei');
    }

    // Setze das Passwort für das ZIP-Archiv
    $zip->setPassword($zipPassword);

    // Füge die MySQL-Dump-Datei zum ZIP-Archiv hinzu
    if (!$zip->addFile($sqlDumpFile, basename($sqlDumpFile)) || !$zip->setEncryptionName(basename($sqlDumpFile), ZipArchive::EM_AES_256)) {
        die('Fehler beim Hinzufügen der SQL-Dump-Datei zum ZIP-Archiv');
    }

    // Funktion zum Hinzufügen von Dateien und Unterordnern zum ZIP-Archiv
    addFolderToZip($directoryToBackup, $zip, '', $zipPassword);

    // Schliesse das ZIP-Archiv
    $zip->close();

    // Lösche die MySQL-Dump-Datei
    unlink($sqlDumpFile);

    echo 'Backup erfolgreich erstellt: ' . $zipFileName;
}

/**
 * Erstellt einen SQL-Dump der angegebenen MySQL-Datenbank.
 *
 * @param mysqli $mysqli MySQLi Verbindungsobjekt
 * @param string $sqlDumpFile Pfad zur SQL-Dump-Datei
 */
function createSqlDump($mysqli, $sqlDumpFile)
{
    $tables = $mysqli->query('SHOW TABLES');
    $sqlDump = '';

    while ($row = $tables->fetch_row()) {
        $table = $row[0];
        $createTable = $mysqli->query('SHOW CREATE TABLE ' . $table)->fetch_row();
        $sqlDump .= "\n\n" . $createTable[1] . ";\n\n";

        $rows = $mysqli->query('SELECT * FROM ' . $table);
        $numFields = $rows->field_count;

        while ($row = $rows->fetch_row()) {
            $sqlDump .= 'INSERT INTO ' . $table . ' VALUES(';
            for ($i = 0; $i < $numFields; $i++) {
                if (isset($row[$i])) {
                    $sqlDump .= '"' . $mysqli->real_escape_string($row[$i]) . '"';
                } else {
                    $sqlDump .= 'NULL';
                }
                if ($i < ($numFields - 1)) {
                    $sqlDump .= ',';
                }
            }
            $sqlDump .= ");\n";
        }
    }

    file_put_contents($sqlDumpFile, $sqlDump);
}

/**
 * Fügt Dateien und Unterordner eines Verzeichnisses einem ZIP-Archiv hinzu.
 *
 * @param string $folder Pfad zum Verzeichnis
 * @param ZipArchive $zip ZipArchive-Objekt
 * @param string $folderInZip Pfad innerhalb des ZIP-Archivs
 * @param string $zipPassword Passwort für die ZIP-Verschlüsselung
 */
function addFolderToZip($folder, $zip, $folderInZip = '', $zipPassword = '')
{
    $handle = opendir($folder);
    while (($file = readdir($handle)) !== false) {
        if ($file == '.' || $file == '..') {
            continue;
        }
        $filePath = $folder . '/' . $file;
        $filePathInZip = $folderInZip . '/' . $file;
        if (is_dir($filePath)) {
            $zip->addEmptyDir($filePathInZip);
            addFolderToZip($filePath, $zip, $filePathInZip, $zipPassword);
        } else {
            if (!$zip->addFile($filePath, $filePathInZip) || !$zip->setEncryptionName($filePathInZip, ZipArchive::EM_AES_256)) {
                die('Fehler beim Hinzufügen der Datei ' . $filePath . ' zum ZIP-Archiv');
            }
        }
    }
    closedir($handle);
}

// Beispielaufruf
createBackup('localhost', 'dein_benutzername', 'dein_passwort', 'deine_datenbank', '/pfad/zu/deinem/verzeichnis', '/pfad/zu/backup/verzeichnis', 'dein_verschluesselungspasswort');
?>
Kostenloses PHP-Skript für MySQL- und Verzeichnis-Backup in Webhosting-Umgebungen