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?
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
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. –
@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 –