2011-01-01 15 views
15

Kennt jemand eine saubere PHP-basierte Lösung, die Remote-Websites mit FTP sichern kann?Website-Sicherung in PHP?

Must haves:

  • rekursive FTP-Backups
  • Mögliche über einen cron-Job
  • Einfach zu konfigurieren (leicht Hinzufügen von mehreren Standorten)
  • Lokale Speicherung von Backup-Dateien auszuführen genügt

Wäre nett:

  • Gesicherte Websites werden als ZIP-Dateien gespeichert
  • Eine nette Schnittstelle Dinge zu verwalten
  • Benachrichtigung bereitstellt, wenn Sicherung erfolgreich war oder fehlgeschlagen
  • Does inkrementelle Sicherungen
  • Ist MySQL-Datenbank-Backups

Ich brauche das PHP-basiert, weil es auf Shared-Hosting-Pakete verwendet wird, die die Verwendung der Standard-GNU/Linux-Tools nicht zulassen.

+9

Warum überhaupt PHP? 'rsync' erfüllt alle Ihre" Muss "-Anforderungen. Wie planen Sie, Zip-Dateien und inkrementelle Backups zu verwenden? – meagar

+0

Ich stimme @meagar zu, php scheint eine schlechte Wahl für so etwas zu sein. Auch das lokale Speichern von Sicherungen hilft nicht, wenn der Computer vollständig ausfällt. –

+0

@meagar dies ist für eine gegenseitige Backup-Lösung zwischen zwei freigegebenen Web-Hosts, so dass nur PHP (na ja, und vielleicht Perl) eine Option ist. @Chris by "local" Ich meine lokal auf dem Server läuft das Backup-Skript, nicht der entfernte Server, der gesichert wird –

Antwort

0

Während Ihr Shared Hosting möglicherweise nicht viele Tools zur Verfügung stellt, muss es zumindest einige bieten. Es kann sich lohnen, Ihren Host nach dem zu fragen, was er für Backups empfiehlt oder empfiehlt. Möchten Sie einen möglichst identischen Host unterstützen? (zumindest in Bezug auf Software)

Um rsync erfolgreich auszuführen, muss es nur auf einer Maschine laufen, die andere muss nicht einmal wissen, dass rysnc existiert, es spielt auch keine Rolle, welche der Maschinen läuft es (Backup oder primärer Host).

Haben Sie CLI Zugriff auf den Server, um Pakete oder PHP-Module zu installieren? Wenn Sie dies nicht tun, sind alle Wetten deaktiviert, da die Wahrscheinlichkeit besteht, dass Ihre PHP-Installation keine der notwendigen Pakete enthält, um darüber nachzudenken, dies von PHP zu versuchen.

Ich würde eine nicht php Lösung wie rysnc oder ein Bash-Skript irgendeiner Art empfehlen. Obwohl Sie den Prozess in einen PHP-Wrapper umwandeln könnten, um ihn zu verwalten.

+0

'rsync' muss auf beiden Maschinen sein. rsync arbeitet mit einem Remote-rsync. – derobert

+0

Nicht, wenn Sie eine geeignete Remote Shell ausführen - was im Nachhinein wahrscheinlich nicht möglich ist. –

3

Ich habe so etwas in einem Cron-Job PHP-Skript zuvor getan. Nicht sicher, ob es der beste Weg ist, aber es funktioniert sicherlich.

$backup_file = '/home/example/sql_backup/mo_'.date('Y-m-d').'.sql.gz'; 
$command = '/usr/bin/mysqldump -c -h'.DB_HOST.' -u'.DB_USER.' -p'.DB_PASS.' --default-character-set=latin1 -N '.DB_NAME.' | gzip > '.$backup_file; 
exec($command); 

Sie könnten dann eine sftp auf den Remote-Server ausführen.

Sie könnten die Dateiordner in ähnlicher Weise mit exec() und Linux-Zipping tun.

+0

Ich benutze dies hauptsächlich, um den Benutzern des Systems eine Möglichkeit zu geben, von einem benutzerdefinierten PHP-Datenbank-Backup-Manager zu einem früheren Zustand der Datenbank zurückzukehren. – dqhendricks

1

Ich schrieb tatsächlich einen Artikel mit Skripten, wie ich dies mit PHP, Bash und einigen anderen Open-Source-Software erreicht, um die vorformatierten E-Mail-Benachrichtigungen über die Backups zu senden.

http://codeuniversity.com/scripts/scr1

Meine Anforderungen waren ziemlich ähnlich, obwohl es kein FTP beteiligt ist. Es ist alles lokal gemacht. Schau es dir an. Vielleicht finden Sie es nützlich.

+0

Prost, ich werde einen Blick darauf werfen! –

2

I codiert dies die FTP-Backups zu handhaben, nicht sicher, ob es Ihren spezifischen Bedürfnissen passt tho:

class Backup 
{ 
    public $ftp = null; 
    public $files = array(); 

    public function FTP($host, $user = null, $pass = null, $port = 21, $path = '/') 
    { 
     if ((extension_loaded('ftp') === true) && (extension_loaded('zip') === true)) 
     { 
      $this->ftp = ftp_connect($host, $port, 5); 

      if (is_resource($this->ftp) === true) 
      { 
       if (ftp_login($this->ftp, $user, $pass) === true) 
       { 
        $zip = new ZipArchive(); 

        if (is_object($zip) === true) 
        { 
         ftp_pasv($this->ftp, true); 

         if ($zip->open(sprintf('./%s_%s.zip', $host, date('YmdHis', time())), ZIPARCHIVE::CREATE) === true) 
         { 
          $this->FTP_Map($path); 

          while (($file = array_shift($this->files)) !== null) 
          { 
           if (preg_match('~/$~', $file) > 0) 
           { 
            $zip->addEmptyDir(preg_replace('~^[\\/]+~', '', $file)); 
           } 

           else 
           { 
            $stream = tempnam(sys_get_temp_dir(), __CLASS__); 

            if (is_file($stream) === true) 
            { 
             if (ftp_get($this->ftp, $stream, $file, FTP_BINARY, 0) === true) 
             { 
              $zip->addFromString(preg_replace('~^[\\/]+~', '', $file), file_get_contents($stream)); 
             } 

             unlink($stream); 
            } 
           } 
          } 
         } 

         $zip->close(); 
        } 
       } 

       ftp_close($this->ftp); 
      } 
     } 

     return false; 
    } 

    public function FTP_Map($path = '/') 
    { 
     if (is_resource($this->ftp) === true) 
     { 
      $files = ftp_nlist($this->ftp, ltrim($path, '/')); 

      if (is_array($files) === true) 
      { 
       foreach ($files as $file) 
       { 
        if (@ftp_chdir($this->ftp, $file) !== true) 
        { 
         $this->files[] = sprintf('/%s/%s', trim($path, '\\/'), trim($file, '\\/')); 
        } 

        else if (ftp_cdup($this->ftp) === true) 
        { 
         if (array_push($this->files, sprintf('/%s/%s/', trim($path, '\\/'), trim($file, '\\/'))) > 0) 
         { 
          $this->FTP_Map(sprintf('/%s/%s/', trim($path, '\\/'), trim($file, '\\/'))); 
         } 
        } 
       } 

       return true; 
      } 
     } 

     return false; 
    } 
} 

Verbrauch:

$Backup = new Backup(); 

$Backup->FTP('demo.wftpserver.com', 'demo-user', 'demo-user', 21, '/text/'); 

Für MySQL-Backups, würde SELECT INTO OUTFILE es tun?

+0

siehe auch: http://stackoverflow.com/questions/4576025/web-site-backup-in-php/4845295#4845295 –

+0

@Marc: Danke für das Heads-up. –

1

Ich benutze myRepono, zusätzlich zu dem, was Sie erwähnt haben, wenn schnelle und automatische Backups durchführt und es ist sehr stabil und sicher.