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ć?
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
Zgadzam się z @meagar, php wydaje się złym wyborem na coś takiego. Lokalne przechowywanie kopii zapasowych nie pomaga, gdy maszyna całkowicie zawiedzie. –
@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 –