Laravel 資料庫及專案檔案自動備份指北 (spatie/Laravel-backup)

王鯨弋發表於2018-08-22

原始碼和資料庫備份功能

安裝:

composer require spatie/laravel-backup

tips:

  • 報錯:
    Installation failed, reverting ./composer.json to its original content.

  • 原因:
    spatie/laravel-backup 最新版需要php7.1

  • 解決:
    根據不同的PHP版本下載不同版本的 spatie/laravel-backup 比如我的專案PHP要求大於5.6 而v3.x-dev支援 PHP 5.5composer require spatie/laravel-backup v3.x-dev

釋出配置檔案 config/backup.php

php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"

出現 config/backup.php 檔案說明安裝成功

執行 php artisan 命令可以看到:

   backup
    backup:clean        Remove all backups older than specified number of days in config.
    backup:list         Display a list of all backups.
    backup:monitor      Monitor the health of all backups.
    backup:run          Run the backup.

執行 php artisan backup:run 開始備份

tips:

因為備份時預設會傳送郵件通知,所以如果你的專案還沒有配置郵件會導致如下報錯:

Copying zip failed because: Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required
".
Backup failed because Connection to smtp.mailtrap.io:2525 Timed Out.
#0 /home/vagrant/Code/larabbs/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php(339): Swift_Transport_AbstractSmtpTransport->getFullResponse(14)
#1 /home/vagrant/Code/larabbs/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpTransport.php(305): Swift_Transport_AbstractSmtpTransport->executeCommand('HELO [127.0.0.1...', Array, Array, false, NULL)
.
.
.
#38 /home/vagrant/Code/larabbs/artisan(37): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#39 {main}
Backup failed because: Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required
".

In AbstractSmtpTransport.php line 473:

  Connection to smtp.mailtrap.io:2525 Timed Out

In StreamBuffer.php line 166:

  Connection to smtp.mailtrap.io:2525 Timed Out

很簡單我們在命令列中再執行一下 php artisan backup:run -h 可以看到提示:

Usage:
  backup:run [options]

Options:
      --filename[=FILENAME]
      --only-db
      --db-name[=DB-NAME]             (multiple values allowed)
      --only-files
      --only-to-disk[=ONLY-TO-DISK]
      --disable-notifications // 在當前命令中忽略郵件提醒
  -h, --help                         Display this help message
  -q, --quiet                        Do not output any message
  -V, --version                      Display this application version
      --ansi                         Force ANSI output
      --no-ansi                      Disable ANSI output
  -n, --no-interaction               Do not ask any interactive question
      --env[=ENV]                    The environment the command should run under
  -v|vv|vvv, --verbose               Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Help:
  Run the backup.

接著: php artisan backup:run --disable-notifications

如果專案檔案比較多的話則需要一會時間來備份,我們可以先只備份資料庫試一下:
php artisan backup:run --disable-notifications --only-db

備份成功可以在 'storage/app/' 中看到 .zip 字尾的壓縮檔案,這就是備份檔案了。(你可以解壓出來看看)

config/laravel-backup.php

'destination' => [
            /*
             * The disk names on which the backups will be stored.
             */
            'disks' => [
                'local',
            ],
 ],

config/filesystems.php:

'disks' => [

    'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
    ],
],

從以上可以 看出 備份的.zip檔案 在 storge/app/http---localhost/檔案中

只備份檔案

php artisan backup:run --only-files

只備份資料庫

php artisan backup:run --only-db

自動備份(linux自帶 定時任務工具crontab 無需安裝)

vagrant provision

配置需要的定時任務

./app/Console/Kernel.php:

  protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')
        //          ->hourly();
        $schedule->command('backup:clean')->daily()->at('10:00');
        $schedule->command('backup:run --disable-notifications')->->everyThirtyMinutes();;//每過30分鐘備份一次
    }

排程頻率設定

當然,你可以為你的任務分配多種排程計劃:

方法 描述
->cron('* * * * * *'); 在自定義的 Cron 時間表上執行該任務
->everyMinute(); 每分鐘執行一次任務
->everyFiveMinutes(); 每五分鐘執行一次任務
->everyTenMinutes(); 每十分鐘執行一次任務
->everyFifteenMinutes(); 每十五分鐘執行一次任務
->everyThirtyMinutes(); 每半小時執行一次任務
->hourly(); 每小時執行一次任務
->hourlyAt(17); 每小時的第 17 分鐘執行一次任務
->daily(); 每天午夜執行一次任務
->dailyAt('13:00'); 每天的 13:00 執行一次任務
->twiceDaily(1, 13); 每天的 1:00 和 13:00 分別執行一次任務
->weekly(); 每週執行一次任務
->monthly(); 每月執行一次任務
->monthlyOn(4, '15:00'); 在每個月的第四天的 15:00 執行一次任務
->quarterly(); 每季度執行一次任務
->yearly(); 每年執行一次任務
->timezone('America/New_York'); 設定時區

你也可以直接前往 任務排程文件 複習一下;

hometead 可自動生成cronta定時任務檔案:

tips: schedule: true 冒號後面必須空格,否則語法錯誤

Homestead.yaml:
  sites:
    - map: wangj_task.io
      to: /home/vagrant/code/Task/public
      schedule: true #務必空格!!!

vagrant@homestead:/etc/cron.d$ ls
mdadm php popularity-contest sysstat wangjtaskio

vagrant@homestead:/etc/cron.d$ cat wangjtaskio

#每分鐘執行一次  artisan schedule:run
  * * * * * vagrant  . /home/vagrant/.profile;
  /usr/bin/php/home/vagrant/code/Task/public/../artisan schedule:run >> /dev/null 2>&1

備份檔案預設放在該目錄: ./storage/app/ 備份檔案格式為 .zip

本作品採用《CC 協議》,轉載必須註明作者和本文連結
相信時間和變化

相關文章