2011-01-01 18 views
15

Qualcuno conosce una soluzione basata su PHP che può eseguire il backup di siti Web remoti tramite FTP?Backup del sito Web in PHP?

must have:

  • ricorsivo FTP backup
  • possibile eseguire attraverso un processo di cron
  • Facile da configurare (facile l'aggiunta di più siti)
  • archiviazione locale dei file di backup è sufficiente

sarebbe bello:

  • siti sottoposti a backup vengono memorizzati come file zip
  • Una bella interfaccia per gestire le cose
  • Fornisce la notifica quando il backup è riuscito o fallito
  • fa i sostegni incrementali
  • Vuol MySQL backup dei database

Ho bisogno che questo sia basato su PHP perché verrà utilizzato su pacchetti di hosting condiviso che non consentono l'uso degli strumenti GNU/Linux standard.

+9

Perché coinvolgere PHP? 'rsync' soddisfa tutti i tuoi requisiti" must have ". Inoltre, come pensi di utilizzare entrambi i file zip e i backup incrementali? – meagar

+0

Sono d'accordo con @meagar, php sembra una scelta sbagliata per qualcosa di simile. Inoltre, l'archiviazione locale dei backup non aiuta quando la macchina fallisce completamente. –

+0

@meagar questo è per una soluzione di backup reciproca tra due host web condivisi, quindi solo PHP (beh, e forse Perl) è un'opzione. @Chris per "locale" Intendo locale sul server su cui viene eseguito lo script di backup, non sul server remoto di cui viene eseguito il backup –

risposta

0

Mentre l'hosting condiviso potrebbe non fornire molti strumenti, deve fornire almeno alcuni, potrebbe valere la pena chiedere al proprio host ciò che fornisce o consiglia per i backup. Vuoi eseguire il backup in un host praticamente identico. (almeno in termini di software)

Per eseguire correttamente rsync, deve essere eseguito solo su una macchina, l'altro non ha bisogno di sapere che esiste rysnc, non importa quale delle macchine è in esecuzione (backup o host primario).

Avete cli accesso al server per installare pacchetti o moduli php? Se non lo fai, allora tutte le scommesse sono spente, poiché è probabile che l'installazione di php non includa nessuno dei pacchetti necessari per cominciare a pensare di provare a farlo da php.

Vorrei raccomandare una soluzione non php come rysnc o uno script di bash di qualche tipo. Sebbene tu possa racchiudere il processo in un wrapper php per gestirlo.

+0

'rsync' deve essere su entrambe le macchine. rsync funziona parlando con un rsync remoto. – derobert

+0

Non se si sta eseguendo una shell remota idonea - che con il senno di poi l'OP probabilmente non può. –

3

Ho fatto qualcosa di simile in uno script PHP di cron job prima. Non sono sicuro che sia il modo migliore, ma sicuramente funziona.

$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); 

Si potrebbe quindi eseguire uno sftp sul server remoto.

Si potrebbero fare le cartelle di file in modo simile usando exec() e lo zip di Linux.

+0

io lo uso principalmente per fornire agli utenti del sistema un modo per tornare a uno stato precedente del database da un gestore di backup del database php personalizzato. – dqhendricks

1

In realtà ho scritto un articolo con gli script inclusi su come ho realizzato questo utilizzando PHP, Bash e alcuni altri pezzi di software open source per inviare le notifiche e-mail preformattate sui backup.

http://codeuniversity.com/scripts/scr1

miei requisiti erano abbastanza simili anche se non c'è FTP coinvolti. È tutto fatto localmente. Dagli un'occhiata. Forse potresti trovarlo utile.

+0

saluti, darò un'occhiata! –

2

ho codificato questo per gestire i backup FTP, non so se si adatta alle vostre esigenze specifiche 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; 
    } 
} 

Usage:

$Backup = new Backup(); 

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

Per i backup MySQL, avrebbe SELECT INTO OUTFILE farlo?

+0

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

+0

@Marc: Grazie per l'heads-up. –

1

Sto usando myRepono, oltre a quello che hai menzionato, se esegue backup rapidi e automatici ed è molto stabile e sicuro.

Problemi correlati