2011-01-01 16 views
15

Czy ktoś zna czyste, oparte na PHP rozwiązanie, które może tworzyć kopie zapasowe zdalnych stron internetowych za pomocą FTP?Kopia zapasowa witryny sieci Web w PHP?

Must haves:

  • Recursive FTP kopii zapasowych
  • możliwe uruchomienie przez crona
  • łatwy w konfiguracji (łatwe dodawanie wielu stron)
  • Lokalnego przechowywania kopii zapasowych plików jest wystarczająca

Byłoby miło:

  • Kopie zapasowe witryny są przechowywane jako pliki zip
  • ładny interfejs do zarządzania rzeczy
  • Zapewnia powiadomienie, gdy kopia zapasowa udało lub nie
  • robi przyrostowych kopii zapasowych
  • Czy MySQL kopii zapasowych

Potrzebuję tego, aby był oparty na PHP, ponieważ będzie używany na wspólnych pakietach hostingowych, które nie pozwalają na używanie standardowych narzędzi GNU/Linux.

+9

Po co w ogóle angażować PHP? 'rsync' spełnia wszystkie twoje" obowiązkowe wymagania ". Ponadto, w jaki sposób zamierzasz używać zarówno plików zip, jak i przyrostowych kopii zapasowych? – meagar

+0

Zgadzam się z @meagar, php wydaje się złym wyborem na coś takiego. Lokalne przechowywanie kopii zapasowych nie pomaga, gdy maszyna całkowicie zawiedzie. –

+0

@meagar jest to wzajemne rozwiązanie kopii zapasowej między dwoma współdzielonymi hostami WWW, więc tylko PHP (dobrze, a może Perl) jest opcją. @Chris przez "lokalny" Mam na myśli lokalny na serwerze, na którym działa skrypt kopii zapasowej, a nie serwer zdalny, który jest archiwizowany –

Odpowiedz

0

Podczas gdy udostępniany hosting może nie zapewniać wielu narzędzi, musi dostarczyć przynajmniej niektóre, warto zapytać hosta, co oferuje, lub zalecić tworzenie kopii zapasowych. Czy chcesz utworzyć kopię zapasową na identycznym hoście? (przynajmniej pod względem oprogramowania)

Aby pomyślnie uruchomić program rsync, musi działać tylko na jednym komputerze, drugi nie musi nawet wiedzieć, że rysnc istnieje, nie ma również znaczenia, które z tych maszyn uruchamia go (backup lub główny host).

Czy masz dostęp cli do serwera, aby zainstalować pakiety lub moduły php? Jeśli nie, wszystkie zakłady są wyłączone, ponieważ istnieje szansa, że ​​instalacja php nie będzie zawierała żadnego pakietu niezbędnego do rozpoczęcia tego procesu od php.

Polecam rozwiązanie inne niż php, takie jak rysnc lub jakiś skrypt bash. Mimo, że można zawinąć proces w opakowaniu php, aby nim zarządzać.

+0

'rsync' musi być na obu komputerach. rsync działa poprzez rozmowę ze zdalnym rsync. – derobert

+0

Nie, jeśli korzystasz z odpowiedniej powłoki zdalnej - co z perspektywy czasu OP prawdopodobnie nie może. –

3

Zrobiłem coś takiego w skryptach PHP dla crona. Nie jestem pewien, czy to najlepszy sposób, ale na pewno działa.

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

Następnie można wykonać sftp na serwerze zdalnym.

Można zrobić foldery plików podobnie, używając exec() i Linux.

+0

Używam tego głównie w celu umożliwienia użytkownikom systemu powrotu do poprzedniego stanu bazy danych z niestandardowego menedżera kopii zapasowej bazy danych php. – dqhendricks

1

Właściwie napisałem artykuł z dołączonymi skryptami o tym, jak to zrobiłem używając PHP, Bash i kilku innych programów open source do wysyłania wstępnie sformatowanych powiadomień e-mail o kopiach zapasowych.

http://codeuniversity.com/scripts/scr1

Moje wymagania były dość podobne, choć nie jest zaangażowany FTP. Wszystko odbywa się lokalnie. Spójrz. Być może uznasz to za przydatne.

+0

okrzyki, przyjrzę się! –

2

I kodowane to do obsługi kopii zapasowych FTP, nie wiem, czy pasuje do Twoich specyficznych potrzeb 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; 
    } 
} 

Zastosowanie:

$Backup = new Backup(); 

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

przypadku kopii zapasowych danych MySQL, by SELECT INTO OUTFILE zrobić?

+0

zobacz także: http://stackoverflow.com/questions/4576025/web-site-backup-in-php/4845295#4845295 –

+0

@Marc: Dzięki za heads-up. –

1

Używam myRepono, oprócz tego, o czym wspomniałeś, jeśli wykonuje szybkie i automatyczne kopie zapasowe i jest bardzo stabilny i bezpieczny.

Powiązane problemy