2010-06-10 87 views
4

我试图将包含多个文件夹和文件的文件夹备份到远程位置(将上传压缩文件)。是否有任何现有的脚本可以帮助我,它检查文件是否在上次备份日期之后被修改,并且仅备份在此之后创建/修改的文件?增量备份/版本备份使用PHP

数据的当前大小为1GB左右,我希望加入50MB-200MB每个月

而且,这将是提取特定日期的文件的状态的最好方法?

+7

它需要是PHP吗?你有权访问Linux或Windows命令行吗?我确信PHP中有这样的解决方案,但其他语言中有更多,更灵活和更稳定的解决方案(例如'rsync')。 – 2010-06-10 11:38:41

+4

'rsync'肯定会工作,但我会建议使用'git','mercurial'或类似工具来完成工作。 – 2010-06-10 11:53:46

+0

@Pekka,我特别寻找基于PHP的解决方案,因为这需要在共享主机上运行。'rsync'无疑是最好的选择,但我一直在寻找可以在共享主机上无缝运行的东西。 – Dogbert 2010-06-10 12:11:56

回答

1

我不认为这样的事情存在。

首先,您需要一些递归函数来查找目录中的所有文件和所有子目录。这个问题有很多例子。我们的想法是使用SCANDIR()函数递归

然后找到的每个文件,你需要检查文件是否已自上次备份后修改,如果被修改,广告它要备份的文件列表。你可以这样做:

if (filemtime($filename) > $last_backup_time) 
{ 
    $files_to_backup[] = $filename; 
} 

最后,对每个文件进行备份,你只需要副本()ftp_put()修改过的文件的归档。

+1

来自SPL的RecursiveDirectoryIterator比递归的scandir调用要好得多;) http://stackoverflow.com/questions/2418068/php-spl-recursivedirectoryiterator-recursiveiteratoriterator-retrieving-the-full – 2010-06-18 12:31:03

+0

你也可以执行rdiff那也是命令。请参阅http://en.wikipedia.org/wiki/Rsync#Variations – redben 2010-06-18 18:37:40

2

我会为此使用Subversion。如果你在远程系统上有一个shell,那么使用cron作业很容易做到这一点。

如果你有一个共享主机,那么你可以通过安装远程驱动器(可能带有保险丝)通过sftp/ftp自动执行此过程,然后通过cron作业运行svn commit

2

您可以致电/从PHP执行的rsync,rsync的是,同步到远程目录,正如其名称所暗示的命令。关于rsync的好处是,它只添加新资源,只发送更新资源上的差异,并删除不在源目录中的任何内容(如果你也想要的话)。 请注意,由此您没有增量备份。为此,您应该使用其他答案中所述的VCS(Git,SVN或CVS)。

这里是a step by step rsync+php tutorial使用它从PHP

0

而不是rsync的范围内,你可以考虑rdiff-backup。使用rsync技术,它可以进行增量远程备份。 Git也可以这样做,但缺点是不能从存储库中删除旧的增量(由于Gits性质)。

我不明白你为什么要编写自己的解决方案,而其他优秀的解决方案已经存在。