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