2011-01-01 14 views
15

¿Alguien conoce una solución limpia basada en PHP que pueda respaldar sitios web remotos mediante FTP?Copia de seguridad del sitio web en PHP?

ricos de la necesidad:

  • recursiva FTP copias de seguridad
  • posible ejecutar a través de una tarea programada
  • Fácil de configurar (Fácil adición de múltiples sitios)
  • Almacenamiento local de los archivos de copia de seguridad es suficiente

Sería bueno:

  • Sostenido sitios se almacenan como archivos zip
  • una interfaz agradable para manejar las cosas
  • Proporciona una notificación cuando la copia de seguridad se ha logrado o no
  • Does copias de seguridad incrementales
  • ¿Tiene copias de seguridad de base de datos MySQL

Necesito que esté basado en PHP porque se usará en paquetes de alojamiento compartido que no permiten el uso de las herramientas estándar de GNU/Linux.

+9

¿Por qué involucrar a PHP en absoluto? 'rsync' cumple con todos sus requisitos obligatorios. Además, ¿cómo planea usar ambos archivos zip y copias de seguridad incrementales? – meagar

+0

Estoy de acuerdo con @meagar, php parece ser una mala elección para algo como esto. Además, el almacenamiento local de copias de seguridad no ayuda cuando la máquina falla completamente. –

+0

@meagar esto es para una solución de copia de seguridad recíproca entre dos servidores web compartidos, por lo que solo PHP (bueno, y tal vez Perl) es una opción. @Chris por "local" me refiero a local en el servidor en el que se ejecuta el script de copia de seguridad, no en el servidor remoto del que se está haciendo una copia de seguridad –

Respuesta

0

Si bien su alojamiento compartido puede no proporcionar muchas herramientas, debe proporcionar al menos algunas, podría valer la pena preguntarle a su anfitrión qué ofrecen o recomendar para las copias de seguridad. ¿Desea realizar una copia de seguridad en un host bastante idéntico? (al menos en términos de software)

Para ejecutar rsync con éxito solo tiene que ejecutarse en una máquina, la otra ni siquiera necesita saber que rysnc existe, tampoco importa cuál de las máquinas lo está ejecutando (copia de seguridad o host principal).

¿Tiene acceso cli al servidor para instalar paquetes o módulos php? Si no lo hace, entonces todas las apuestas están desactivadas, ya que es probable que su instalación de php no incluya ninguno de los paquetes necesarios para comenzar a pensar en intentar esto desde php.

Recomendaría una solución no php como rysnc o un script bash de algún tipo. Aunque podría envolver el proceso en un contenedor php para administrarlo.

+0

'rsync' debe estar en ambas máquinas. rsync funciona hablando con un rsync remoto. – derobert

+0

No si está ejecutando un shell remoto adecuado, lo cual, en retrospectiva, el OP probablemente no pueda. –

3

He hecho algo así en una secuencia de comandos cron PHP antes. No estoy seguro si es la mejor manera, pero ciertamente funciona.

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

Puede ejecutar un sftp en el servidor remoto.

Puede hacer las carpetas de archivos de manera similar con exec() y compresión de Linux.

+0

uso esto principalmente para dar a los usuarios del sistema una forma de volver al estado anterior de la base de datos desde un administrador de copia de seguridad de base de datos php personalizado. – dqhendricks

1

De hecho, escribí un artículo con scripts incluidos sobre cómo logré esto usando PHP, Bash y algunas otras piezas de software de fuente abierta para enviar las notificaciones de correo electrónico preformateadas sobre las copias de seguridad.

http://codeuniversity.com/scripts/scr1

Mis requisitos eran bastante similares, aunque no hay FTP en cuestión. Todo está hecho localmente. Dale una mirada. Tal vez lo encuentres útil.

+0

¡salud, voy a echar un vistazo! –

2

codifiqué esto a manejar las copias de seguridad de FTP, no estoy seguro si se ajusta a sus necesidades específicas 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; 
    } 
} 

Uso:

$Backup = new Backup(); 

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

Para copias de seguridad de MySQL, que SELECT INTO OUTFILE hacerlo?

+0

vea también: http://stackoverflow.com/questions/4576025/web-site-backup-in-php/4845295#4845295 –

+0

@Marc: Gracias por el aviso. –

1

Estoy usando myRepono, además de lo que ha mencionado, si realiza copias de seguridad rápidas y automáticas y es muy estable y seguro.

Cuestiones relacionadas