PHP中的网站备份?

Web site backup in PHP?

提问人:Pekka 提问时间:1/2/2011 最后编辑:Pekka 更新时间:1/4/2016 访问量:9056

问:

有谁知道一个干净的基于PHP的解决方案,可以使用FTP备份远程网站?

必备条件:

  • 递归 FTP 备份
  • 可以通过 cron 作业运行
  • 易于配置(轻松添加多个站点)
  • 备份文件的本地存储就足够了

会很好:

  • 备份的站点存储为 zip 文件
  • 一个漂亮的界面来管理事物
  • 在备份成功或失败时提供通知
  • 执行增量备份
  • MySQL数据库是否备份

我需要它是基于PHP的,因为它将用于不允许使用标准GNU / Linux工具的共享主机包。

PHP FTP 备份

评论

9赞 user229044 1/2/2011
为什么要涉及 PHP? 满足您所有的“必备”要求。另外,您打算如何使用 zip 文件和增量备份?rsync
0赞 Chris Henry 1/2/2011
我同意@meagar的观点,对于这样的事情来说,php似乎是一个糟糕的选择。此外,当计算机完全发生故障时,备份的本地存储也无济于事。
0赞 Pekka 1/2/2011
@meagar这是两个共享Web主机之间的互惠备份解决方案,因此只有PHP(好吧,也许还有Perl)是一种选择。@Chris“本地”是指运行备份脚本的服务器上的本地服务器,而不是正在备份的远程服务器
0赞 user229044 1/2/2011
@pekka rsync 在主机上不可用吗?
0赞 Pekka 1/2/2011
@meagar 它可能在其中一个包上,但我不能在另一个包上依赖它。不过,如果所有其他方法都失败了,那么对于至少一个主机来说,这是一个有趣的选择。

答:

0赞 James Butler 1/14/2011 #1

虽然您的共享主机可能没有提供很多工具,但它必须至少提供一些工具,但可能值得询问您的主机他们提供什么或推荐备份。是否要备份到几乎相同的主机。(至少在软件方面)

要成功运行 rsync,它只需要在一台机器上运行,另一台机器甚至不需要知道 rysnc 的存在,也不管是哪一台机器在运行它(备份主机还是主主机)。

您是否可以通过 cli 访问服务器来安装软件包或 php 模块?如果你不这样做,那么所有的赌注都失败了,因为你的 php 安装很可能不包含任何必要的软件包,以便开始考虑从 php 尝试这一点。

我会推荐一个非 php 解决方案,比如 rysnc 或某种 bash 脚本。虽然你可以将这个过程包装在一个 php 包装器中来管理它。

评论

0赞 derobert 1/15/2011
rsync需要在两台计算机上。rsync 通过与远程 rsync 通信来工作。
0赞 James Butler 1/15/2011
如果你正在运行一个合适的远程 shell,那就不行了——事后看来,OP 可能做不到。
2赞 dqhendricks 1/14/2011 #2

我以前在 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 压缩类似地执行文件夹。

评论

0赞 dqhendricks 1/14/2011
我使用它主要是为了给系统用户提供一种从自定义 PHP 数据库备份管理器回滚到数据库先前状态的方法。
1赞 Steve Dickinson 1/17/2011 #3

我实际上写了一篇文章,其中包含关于我如何使用 PHP、Bash 和其他一些开源软件来发送有关备份的预先格式化的电子邮件通知的脚本。

http://codeuniversity.com/scripts/scr1

我的要求非常相似,尽管不涉及 FTP。这一切都是在本地完成的。看一看。也许你可能会发现它很有用。

2赞 Alix Axel 1/24/2011 #4

我对此进行了编码以处理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

评论

0赞 Marc Gravell 1/31/2011
Смотритетакже: stackoverflow.com/questions/4576025/web-site-backup-in-php/...
1赞 kumo99 12/9/2011 #5

除了您提到的内容之外,我正在使用 myRepono,如果执行快速和自动备份,并且它非常稳定和安全。