提问人:Pekka 提问时间:1/2/2011 最后编辑:Pekka 更新时间:1/4/2016 访问量:9056
PHP中的网站备份?
Web site backup in PHP?
问:
有谁知道一个干净的基于PHP的解决方案,可以使用FTP备份远程网站?
必备条件:
- 递归 FTP 备份
- 可以通过 cron 作业运行
- 易于配置(轻松添加多个站点)
- 备份文件的本地存储就足够了
会很好:
- 备份的站点存储为 zip 文件
- 一个漂亮的界面来管理事物
- 在备份成功或失败时提供通知
- 执行增量备份
- MySQL数据库是否备份
我需要它是基于PHP的,因为它将用于不允许使用标准GNU / Linux工具的共享主机包。
答:
虽然您的共享主机可能没有提供很多工具,但它必须至少提供一些工具,但可能值得询问您的主机他们提供什么或推荐备份。是否要备份到几乎相同的主机。(至少在软件方面)
要成功运行 rsync,它只需要在一台机器上运行,另一台机器甚至不需要知道 rysnc 的存在,也不管是哪一台机器在运行它(备份主机还是主主机)。
您是否可以通过 cli 访问服务器来安装软件包或 php 模块?如果你不这样做,那么所有的赌注都失败了,因为你的 php 安装很可能不包含任何必要的软件包,以便开始考虑从 php 尝试这一点。
我会推荐一个非 php 解决方案,比如 rysnc 或某种 bash 脚本。虽然你可以将这个过程包装在一个 php 包装器中来管理它。
评论
rsync
需要在两台计算机上。rsync 通过与远程 rsync 通信来工作。
我以前在 cron 作业 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 和其他一些开源软件来发送有关备份的预先格式化的电子邮件通知的脚本。
http://codeuniversity.com/scripts/scr1
我的要求非常相似,尽管不涉及 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备份,会这样做吗?SELECT INTO OUTFILE
评论
除了您提到的内容之外,我正在使用 myRepono,如果执行快速和自动备份,并且它非常稳定和安全。
下一个:记录和存储高分辨率手绘图
评论
rsync