PHP中的网站备份?

PHP中的网站备份?,php,ftp,backup,Php,Ftp,Backup,有人知道一个干净的基于PHP的解决方案,可以使用FTP备份远程网站吗 必备品: 递归FTP备份 可以运行cron作业 易于配置(易于添加多个站点) 备份文件的本地存储已足够 那就好了: 备份的站点存储为zip文件 一个很好的界面来管理事情 在备份成功或失败时提供通知 执行增量备份吗 做MySQL数据库备份吗 我需要这是基于PHP的,因为它将用于不允许使用标准GNU/Linux工具的共享主机包。虽然您的共享主机可能不提供很多工具,但它必须提供至少一些,但可能值得询问您的主机他们提供了什么或

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

必备品:

  • 递归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执行快速和自动备份,而且非常稳定和安全。

为什么要使用PHP
rsync
满足您的所有“必备”要求。另外,您打算如何使用zip文件和增量备份呢?我同意@meagar的观点,php似乎是一个糟糕的选择。此外,当机器完全故障时,备份的本地存储也没有帮助。@meagar这是两个共享web主机之间的互惠备份解决方案,因此只有PHP(可能还有Perl)是一个选项@Chris所说的“本地”是指备份脚本运行的服务器上的本地,而不是正在备份的远程服务器上的本地up@pekkarsync在主机上不可用吗?@meagar它可能在其中一个包上,但我不能依赖另一个包。尽管如此,如果所有其他方法都失败了,至少对于一台主机来说,这是一个有趣的选择。我使用它主要是为了让系统用户能够从自定义php数据库备份管理器回滚到数据库的以前状态。
rsync
需要在两台机器上。rsync的工作原理是与远程rsync通信。如果您运行的是合适的远程shell,则不会这样做——事后看来,OP可能无法做到这一点。另请参阅:@Marc:谢谢提醒。