PHP中的网站备份?
有人知道一个干净的基于PHP的解决方案,可以使用FTP备份远程网站吗 必备品:PHP中的网站备份?,php,ftp,backup,Php,Ftp,Backup,有人知道一个干净的基于PHP的解决方案,可以使用FTP备份远程网站吗 必备品: 递归FTP备份 可以运行cron作业 易于配置(易于添加多个站点) 备份文件的本地存储已足够 那就好了: 备份的站点存储为zip文件 一个很好的界面来管理事情 在备份成功或失败时提供通知 执行增量备份吗 做MySQL数据库备份吗 我需要这是基于PHP的,因为它将用于不允许使用标准GNU/Linux工具的共享主机包。虽然您的共享主机可能不提供很多工具,但它必须提供至少一些,但可能值得询问您的主机他们提供了什么或
- 递归FTP备份
- 可以运行cron作业
- 易于配置(易于添加多个站点)
- 备份文件的本地存储已足够
- 备份的站点存储为zip文件
- 一个很好的界面来管理事情
- 在备份成功或失败时提供通知
- 执行增量备份吗
- 做MySQL数据库备份吗
我需要这是基于PHP的,因为它将用于不允许使用标准GNU/Linux工具的共享主机包。虽然您的共享主机可能不提供很多工具,但它必须提供至少一些,但可能值得询问您的主机他们提供了什么或建议备份。是否要备份到几乎相同的主机。(至少在软件方面) 要成功运行rsync,它只需在一台机器上运行,另一台甚至不需要知道rysnc是否存在,运行它的机器(备份或主主机)也无关紧要 您是否有cli访问服务器以安装软件包或php模块?如果您不这样做,那么所有的赌注都没有了,因为您的php安装很可能不会包含任何必要的包n,您可以开始考虑从php尝试这样做
我建议使用非php解决方案,如rysnc或某种bash脚本。尽管您可以用php包装器来管理流程。我以前在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压缩来类似地处理文件夹。实际上,我写了一篇文章,其中包含了脚本,介绍了我如何使用PHP、Bash和其他一些开源软件来发送有关备份的预格式化电子邮件通知
我的要求相当相似,尽管没有涉及FTP。都是在本地完成的。看一看。也许您会发现它很有用。我编写了这个代码来处理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备份,
选择入出文件
就可以了吗?除了您提到的,我正在使用的if执行快速和自动备份,而且非常稳定和安全。为什么要使用PHPrsync
满足您的所有“必备”要求。另外,您打算如何使用zip文件和增量备份呢?我同意@meagar的观点,php似乎是一个糟糕的选择。此外,当机器完全故障时,备份的本地存储也没有帮助。@meagar这是两个共享web主机之间的互惠备份解决方案,因此只有PHP(可能还有Perl)是一个选项@Chris所说的“本地”是指备份脚本运行的服务器上的本地,而不是正在备份的远程服务器上的本地up@pekkarsync在主机上不可用吗?@meagar它可能在其中一个包上,但我不能依赖另一个包。尽管如此,如果所有其他方法都失败了,至少对于一台主机来说,这是一个有趣的选择。我使用它主要是为了让系统用户能够从自定义php数据库备份管理器回滚到数据库的以前状态。rsync
需要在两台机器上。rsync的工作原理是与远程rsync通信。如果您运行的是合适的远程shell,则不会这样做——事后看来,OP可能无法做到这一点。另请参阅:@Marc:谢谢提醒。