有人知道一个干净的基于PHP的解决方案,可以使用FTP备份远程网站吗?
必须拥有:
会很好:
我需要这是基于PHP的,因为它将用于不允许使用标准GNU / Linux工具的共享主机包。
答案 0 :(得分:3)
我之前在cron job PHP脚本中做过类似的事情。不确定它是否是最好的方式,但它确实有效。
$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);
然后你可以执行一个sftp到远程服务器。
你可以使用exec()和linux zipping来类似地执行文件夹。
答案 1 :(得分:2)
我将其编码为处理FTP备份,不确定它是否符合您的特定需求:
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;
}
}
用法:
$Backup = new Backup();
$Backup->FTP('demo.wftpserver.com', 'demo-user', 'demo-user', 21, '/text/');
对于MySQL备份,SELECT INTO OUTFILE
会这样做吗?
答案 2 :(得分:1)
我实际上写了一篇文章,其中包含了如何使用PHP,Bash和其他一些开源软件完成此操作的脚本,以发送有关备份的预格式化电子邮件通知。
http://codeuniversity.com/scripts/scr1
虽然没有涉及FTP,但我的要求非常相似。这一切都在当地完成。看看吧。也许你会发现它很有用。
答案 3 :(得分:1)
我正在使用myRepono,除了你提到的内容,如果执行快速和自动备份,它非常稳定和安全。
答案 4 :(得分:0)
虽然您的共享主机可能不提供很多工具,但它必须至少提供一些,但可能值得向主机询问它们提供的内容或建议进行备份。你想要备份到一个非常相同的主机吗? (至少在软件方面)
要成功运行rsync,它只需要在一台机器上运行,另一台机器甚至不需要知道rysnc存在,运行它的哪台机器(备份或主机)也无关紧要
你有cli访问服务器来安装包或php模块吗?如果你没有,那么所有的赌注都是关闭的,因为你的php安装可能不会包含任何必要的软件包,以便开始考虑从php尝试这个。
我会推荐像rysnc或某种bash脚本这样的非php解决方案。虽然你可以将进程包装在php包装器中来管理它。