Verification: a143cc29221c9be0

Php backup файлов на сервер

Php backup файлов на сервер

Datenbank-Backup mittels mysqldump

Mittels dem Tool mysqldump, welches bei vielen Server zur Verfügung steht, lässt sich sehr bequem ein Datenbankbackup erstellen:

?php

$dbhost = 'localhost';

$dbuser = 'username';

$dbpassword = 'password';

$dbname = 'datenbankname';

$dumpfile = "backups/" . $dbname . "_" . date("Y-m-d_H-i-s") . ".sql";

echo "Start dump\n";

exec("mysqldump --user=$dbuser --password=$dbpassword --host=$dbhost $dbname > $dumpfile");

echo "-- Dump completed -- ";

echo $dumpfile;

Dieses kleine Script erstellt euch eine sql-Datei im Ordner Backups. Falls ihr die Datei gleich mittels gzip komprimieren wollt, könnt ihr folgendes Script nutzen. Dieses schreibt euch eine gzip-Komprimierten Dump eurer Datenbank in das backups-Verzeichnis.

?php

$dbhost = 'localhost';

$dbuser = 'username';

$dbpassword = 'password';

$dbname = 'datenbankname';

$dumpfile = 'backups/' . $dbname . '_' . date("Y-m-d_H-i-s") . '.sql.gz';

echo "Start dump\n";

passthru("mysqldump --user=$dbuser --password=$dbpassword --host=$dbhost $dbname | gzip -c  > $dumpfile");

echo "-- Dump completed -- ";

echo $dumpfile;

Damit diese Scripts funktionieren, muss exec bzw. passthru bei euch auf dem Server aktiviert sein. Gegebenenfalls müsst ihr den Pfad zu mysqldump anpassen, beispielsweise zu /usr/bin/mysqldump. Ob und wie ihr mysqldump nutzen könnt erfahrt ihr von eurem Webhoster.

Datenbankbackup mittels PHP

Steht kein mysqldump zur Verfügung, so könnt ihr mittels mysqldump-php eine ähnliche Funktionalität erreichen. Ladet dazu zuerst den Source-Code von Version 2 oder neuer herunter und entpackt das Zip-Archiv. Ihr benötigt dann das Script /src/Ifsnop/Mysqldump/Mysqldump.php.

Zum Backup der Datenbank könnt ihr folgenden Script verwenden:

?php

$dbhost = 'localhost';

$dbuser = 'username';

$dbpassword = 'password';

$dbname = 'datenbankname';

$dumpfile = 'backups/' . $dbname . '_' . date("Y-m-d_H-i-s") . '.sql';

include_once('euer/pfad/zu/Mysqldump.php');

$dump = new Ifsnop\Mysqldump\Mysqldump("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpassword);

$dump->start($dumpfile);

Import eines Datenbankbackups

Das Backup der Datenbank könnt ihr am einfachsten mittels phpMyAdmin -> Importieren wieder importieren. Bei sehr großen Backups mit Millionen von Einträgen stößt phpMyAdmin an seine Grenzen. Dort ist ein Import über die Konsole zu empfehlen. Ruft dazu folgenden Befehl auf:

Windows (mit XAMPP):

d:\XAMPP\mysql\bin\mysql.exe -u root -p DATENBANKNAME SQLDATEI.sql

Linux:

mysql -u root -p DATENBANKNAME SQLDATEI.sql

Datenbankbackup per E-Mail versenden

Aktuell wird das Backup noch im backups-Ordner abgespeichert. Sollte wirklich ein entsprechender Ernstfall passieren und die Festplatte beschädigt sein, dann bringt euch ein Backup dort herzlich wenig. Deswegen solltet das Backup stets auf einem anderen Server/Rechner abgespeichert werden. Entweder ihr ladet es regelmäßig herunter und speichert es z.B. auf eurem lokalen Rechner, oder ihr lasst das oben erstelle Backup direkt per E-Mail an euch senden (solange euer Backup nicht zu groß wird):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

?php

/*

* Euer Backupscript der das Backup in den Pfad $dumpfile schreibt

*/

function mail_att($to, $from, $subject, $message, $file) {

// $to Empfänger

// $subject Betreff

// $message Inhalt der Email

// $file Pfad zur Datei die versendet werden soll

$mime_boundary = "-----=" . md5(uniqid(rand(), 1));

$header = "From: ".$from."\r\n";

$header.= "MIME-Version: 1.0\r\n";

$header.= "Content-Type: multipart/mixed;\r\n";

$header.= " boundary=\"".$mime_boundary."\"\r\n";

$content = "This is a multi-part message in MIME format.\r\n\r\n";

$content.= "--".$mime_boundary."\r\n";

$content.= "Content-Type: text/plain charset=\"iso-8859-1\"\r\n";

$content.= "Content-Transfer-Encoding: 7bit\r\n\r\n";

$content.= $message."\r\n";

//Datei anhaengen    

$name = basename($file);

$data = chunk_split(base64_encode(file_get_contents($file)));

$len = filesize($file);

$content.= "--".$mime_boundary."\r\n";

$content.= "Content-Disposition: attachment;\r\n";

$content.= "\tfilename=\"$name\";\r\n";

$content.= "Content-Length: .$len;\r\n";

$content.= "Content-Type: application/x-gzip; name=\"".$file."\"\r\n";

$content.= "Content-Transfer-Encoding: base64\r\n\r\n";

$content.= $data."\r\n";

return mail($to, $subject, $content, $header);

}  

mail_att("[email protected]", "[email protected]", "Backup ".$dumbfile, "Backup wurde erfolgreich erstellt und befindet sich im Anhang", $dumbfile);

FTP Backups (bisher)

Mein Blog läuft auf dem Hoster ALL-INKL.com, den ich nebenbei gesagt nach mehreren Jahren immernoch empfehlen kann.
Bisher habe ich halbwegs (un)regelmäßig manuell, von Hand, FTP Backups erstellt. Also alle paar Monate habe ich über einen FTP Tool wie FileZilla bestimmte Ordner heruntergeladen, Datei für Datei, anschließend in ein Archiv gepackt und irgendwo verstaut. Dieser Prozess ist natürlich in vielerlei Hinsicht nicht zuverlässig, zeitintensiv und aufwändig.
Auch das Sichern der Ordner automatisiert mit Tools wie SyncBack (mein Artikel dazu) wird immer zeitintensiver, je größer die zu sichernde Datenmenge wird. Außerdem muss immer ein PC, auf dem die Tools laufen, an sein.

FTP Backups via PHP Skript

Sinnvoller ist es, diese Backups auf dem Server des Webhosters erstellen zu lassen. So wird der heimische PC nicht belastet.
All-Inkl bietet dafür ein recht einfaches PHP Skript zum Sichern eines einzelnen FTP Ordners oder des gesamten All-Inkl FTP Accounts.

Ich habe dieses Skript ausgebaut und um verschiedene Funktionen ergänzt:

  • beliebig viele Ordner des All-Inkl Accounts in einzelne .tar.gz Archive sichern
  • Einschränkung der Anzahl aufgehobener Backups – älteste Backups werden automatisch gelöscht
  • detaillierte Ausgabe inklusive benötigter Zeit
  • E-Mail Benachrichtigung

Screenshot

Das Bild zeigt die Ausgaben des Backup Skripts und die versendete E-Mail Benachrichtigung

Code

Achtung: Dieses Backup Skript habe ich in Version 1.1 noch einmal stark erweitert. Ich empfehle diese komplexere Lösung zu benutzen. Besser wäre sogar die Version 1.2, mit der sich zusätzlich MySQL Datenbanken mitsichern lassen.

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.


  // PHP-Konfiguration optimieren
  // if no errors are shown, please check htaccess restrictions by "php_flag display_errors off"
  // in this or parent folders
  @error_reporting(E_ALL);
  @ini_set("max_execution_time", 300);
  @ini_set("memory_limit", "256M");
  header('Content-Type: text/html; charset=utf-8');
  include "Archive/Tar.php";
  $pfad = preg_replace('/(\/www\/htdocs\/\w+\/).*/', '$1', realpath(__FILE__));
  $alltime = 0;

  // ########## EDIT THIS VARIABLES ###################
  $foldertobackup = array("bonnie", "tests", "locationmap", "blog"); // which root folders should get backed up?
  $backupfilemaximum = 2; // how many archives should be stored?
  $dir = $pfad."backup/"; // in which subfolder is this backup php file? this would be: "root/backup/"
  $sendmail = 1; // send notification mail when all backups are done - should be 1/"yes"/"ja" or 0/"no"/"nein"
  $sendmailto = "admin@yourdomain.com"; // valid mail address to send the mail to
  // ##################################################

  foreach ($foldertobackup as $verzeichnis) {
    $jobtime = time();
    echo "

########################################
"; echo "Verzeichnis ".$verzeichnis." wird gesichert...
"; flush(); // Name: [verzeichnis]_[Datum]_[Uhrzeit].tar.gz $archivname = $verzeichnis.date('_Y-m-d_His').".tar.gz"; // Name: [All-Inkl-Accountname]_[Datum]_[Uhrzeit].tar.gz //$archivname = preg_replace('/.+\/(.+)\/$/', '$1', $pfad).date('_Y-m-d_His').".tar.gz"; // Auszuschließende Ressourcen $ignorieren = array("*.sql.gz", "*.tar.gz", "usage", "logs"); // ######### create backup $archiv = new Archive_Tar($archivname, true); $archiv->setIgnoreList($ignorieren); $archiv->createModify($pfad.$verzeichnis, "", $pfad); $backuptime = time() - $jobtime; if (is_int($backuptime)) { echo "Backup fertig: ".$archivname." (Dauer: ".$backuptime." Sekunden)
"; } else { echo "Backup fertig: ".$archivname."
"; } echo "Aufräumen der Backups...
"; flush(); // integer starts at 0 before counting $i = 0; $backupfiles = array(); // ######### collect valid backup files if ($handle = opendir($dir)) { while (($file = readdir($handle)) !== false) { if ( is_int(strpos($file, $verzeichnis)) == true && preg_match('/\.tar.gz$/i', $file) && !in_array($file, array('.', '..')) && !is_dir($dir.$file) ) { $backupfiles[$dir.$file] = filectime($dir.$file); } } } echo count($backupfiles)." valide Backups dieses Ordners gefunden, "; echo $backupfilemaximum." Backups sollen behalten werden. "; $backupcountdif = count($backupfiles)-$backupfilemaximum; if ($backupcountdif"; } else if ($backupcountdif==1) { echo "1 Backup wird gelöscht:
"; } else if ($backupcountdif>=2) { echo $backupcountdif." Backups werden gelöscht:
"; } flush(); // ######### sort and delete oldest backups // sort backup files by date arsort($backupfiles); // reset counter variable $i = 0; // delete oldest files foreach ($backupfiles as $key => $value) { if($i>=$backupfilemaximum) { echo $key." wird gelöscht...
"; if (unlink($key)) { echo "Datei erfolgreich gelöscht.
"; } else { echo "Fehler beim Löschen der Datei.
"; } } $i++; } $jobendtime = time() - $jobtime; if (is_int($jobendtime)) { echo "######################################## (Dauer: ".$jobendtime." Sekunden)
"; $alltime += $jobendtime; } else { echo "########################################
"; } } echo "

Die automatische Sicherung des FTP-PHP-Backup-Skripts '".pathinfo(__FILE__, PATHINFO_BASENAME)."' hat ".count($foldertobackup)." Verzeichnisse in insgesamt ".$alltime." Sekunden gesichert.

"; // ######### send mail if (!isset($sendmail) || $sendmail== 0 && in_array($sendmail, array("no", "nein"))) { echo "Benachrichtigungsmail wurde nicht verschickt."; } else { if(!preg_match( '/^([a-zA-Z0-9])+([.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-]+)+/' , $sendmailto)) { echo "FEHLER: Mail konnte nicht versendet werden, da die Adresse ungültig ist!"; } else { mail( $sendmailto, "Automatische FTP Sicherung abgeschlossen", "Die automatische Sicherung des FTP-PHP-Backup-Skripts ".pathinfo(__FILE__, PATHINFO_BASENAME)." hat ".count($foldertobackup)." Verzeichnisse in insgesamt ".$alltime." Sekunden gesichert.", "From: backupscript@{$_SERVER['SERVER_NAME']}\r\n" . "Reply-To: backupscript@{$_SERVER['SERVER_NAME']}\r\n" . "Content-Type: text/html\r\n" ) or die("FEHLER: Mail konnte wegen eines unbekannten Fehlers nicht versendet werden"); echo "Benachrichtigungsmail wurde erfolgreich verschickt!"; } } ?>

Globale Branchen