Резервное копирование веб-сайта на PHP? - PullRequest
15 голосов
/ 02 января 2011

Кто-нибудь знает чистое решение на основе PHP, которое может создавать резервные копии удаленных веб-сайтов с помощью FTP?

Должен иметь:

  • Рекурсивные резервные копии FTP
  • Можно запустить через задание cron
  • Простота настройки (простое добавление нескольких сайтов)
  • Достаточно локального хранилища файлов резервных копий

Было бы неплохо:

  • Резервные копии сайтов хранятся в виде zip-файлов
  • Хороший интерфейс для управления вещами
  • Предоставляет уведомление об успешном или неудачном резервном копировании
  • Инкрементные резервные копии
  • Делает ли резервные копии базы данных MySQL

Мне нужно, чтобы он был основан на PHP, поскольку он будет использоваться в пакетах общего хостинга, которые не позволяют использовать стандартные инструменты GNU / Linux.

Ответы [ 5 ]

3 голосов
/ 14 января 2011

Я уже делал что-то подобное в PHP-скрипте cron job. Не уверен, что это лучший способ, но он, безусловно, работает.

$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.

2 голосов
/ 23 января 2011

Я кодировал это для обработки резервных копий 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сделать это?

1 голос
/ 09 декабря 2011

Я использую myRepono , в дополнение к тому, что вы упомянули, если выполняет быстрое и автоматическое резервное копирование, и оно очень стабильно и безопасно.

1 голос
/ 17 января 2011

Я на самом деле написал статью с включенными сценариями о том, как я это сделал, используя PHP, Bash и некоторые другие части программного обеспечения с открытым исходным кодом для отправки предварительно отформатированных почтовых уведомлений о резервных копиях.*http://codeuniversity.com/scripts/scr1

Мои требования были довольно похожи, хотя FTP не задействован.Это все сделано на месте.Посмотри.Возможно, вы найдете это полезным.

0 голосов
/ 14 января 2011

Хотя ваш общий хостинг может не предоставлять много инструментов, он должен предоставлять хотя бы некоторые из них, возможно, стоит спросить у вашего хоста, что они предоставляют или рекомендуют для резервного копирования.Вы хотите сделать резервную копию на почти идентичном хосте?(по крайней мере, с точки зрения программного обеспечения)

Для успешного запуска rsync он должен работать только на одной машине, другой не нужно даже знать, что существует rysnc, также не важно, какой измашины, на которых он запущен (резервный или основной).

У вас есть доступ к серверу для установки пакетов или модулей php?Если вы этого не сделаете, то все ставки выключены, так как есть вероятность, что ваша установка php не будет включать в себя какие-либо пакеты, необходимые для того, чтобы начать думать о попытке сделать это с php.как rysnc или сценарий Bash какой-то.Хотя вы можете обернуть процесс в php-оболочку для управления им.

...