PHP中的网站备份?

时间:2011-01-01 22:10:01

标签: php ftp backup

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

必须拥有:

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

会很好:

  • 备份网站存储为zip文件
  • 管理事物的好界面
  • 在备份成功或失败时提供通知
  • 是否进行增量备份
  • MySQL数据库备份

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

5 个答案:

答案 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包装器中来管理它。