> 当博客功能完善的差不多时,博主想到如何才能通过简单的几部操作实现备份功能呢,上网查找了一番,发现一个好方法,故整理代码。 ### laravel-backup 介绍 这个Laravel包创建了应用程序的备份。备份是一个ZIP文件,其中包含您指定的目录中的所有文件以及数据库的转储。备份可以存储在 您在Laravel 5 中配置的任何文件系统上。 对备份感到偏执?不要!您可以将应用程序一次备份到多个文件系统。 一旦安装,备份您的文件和数据库是非常容易的。只要运行这个工匠指令: `php artisan backup:run` 除了进行备份之外,软件包还可以清理旧备份,监控备份的运行状况,并显示所有备份的概述。 ### laravel-backup 安装 `cd 项目根目录` 执行 `composer require spatie/laravel-backup`。 注册服务提供商, 在 `config/app.php`。 'providers' => [ // ... Spatie\Backup\BackupServiceProvider::class, ]; #### 发布配置文件以config/laravel-backup.php运行: php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider" #### config/laravel-backup.php return [ 'backup' => [ /* * The name of this application. You can use this name to monitor * the backups. */ 'name' => env('APP_URL'), 'source' => [ 'files' => [ /* * The list of directories and files that will be included in the backup. */ 'include' => [ base_path(), ], /* * These directories and files will be excluded from the backup. * * Directories used by the backup process will automatically be excluded. */ 'exclude' => [ base_path('vendor'), base_path('node_modules'), ], /* * Determines if symlinks should be followed. */ 'followLinks' => false, ], /* * The names of the connections to the databases that should be backed up * Only MySQL and PostgreSQL databases are supported. */ 'databases' => [ 'mysql', ], ], 'destination' => [ /* * The filename prefix used for the backup zip file. */ 'filename_prefix' => '', /* * The disk names on which the backups will be stored. */ 'disks' => [ 'local', ], ], ], /* * You can get notified when specific events occur. Out of the box you can use 'mail' and 'slack'. * For Slack you need to install guzzlehttp/guzzle. * * You can also use your own notification classes, just make sure the class is named after one of * the `Spatie\Backup\Events` classes. */ 'notifications' => [ 'notifications' => [ \Spatie\Backup\Notifications\Notifications\BackupHasFailed::class => ['mail'], \Spatie\Backup\Notifications\Notifications\UnhealthyBackupWasFound::class => ['mail'], \Spatie\Backup\Notifications\Notifications\CleanupHasFailed::class => ['mail'], \Spatie\Backup\Notifications\Notifications\BackupWasSuccessful::class => ['mail'], \Spatie\Backup\Notifications\Notifications\HealthyBackupWasFound::class => ['mail'], \Spatie\Backup\Notifications\Notifications\CleanupWasSuccessful::class => ['mail'], ], /* * Here you can specify the notifiable to which the notifications should be sent. The default * notifiable will use the variables specified in this config file. */ 'notifiable' => \Spatie\Backup\Notifications\Notifiable::class, 'mail' => [ 'to' => 'your@email.com', ], 'slack' => [ 'webhook_url' => '', ], ], /* * Here you can specify which backups should be monitored. * If a backup does not meet the specified requirements the * UnHealthyBackupWasFound event will be fired. */ 'monitorBackups' => [ [ 'name' => env('APP_URL'), 'disks' => ['local'], 'newestBackupsShouldNotBeOlderThanDays' => 1, 'storageUsedMayNotBeHigherThanMegabytes' => 5000, ], /* [ 'name' => 'name of the second app', 'disks' => ['local', 's3'], 'newestBackupsShouldNotBeOlderThanDays' => 1, 'storageUsedMayNotBeHigherThanMegabytes' => 5000, ], */ ], 'cleanup' => [ /* * The strategy that will be used to cleanup old backups. The default strategy * will keep all backups for a certain amount of days. After that period only * a daily backup will be kept. After that period only weekly backups will * be kept and so on. * * No matter how you configure it the default strategy will never * delete the newest backup. */ 'strategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class, 'defaultStrategy' => [ /* * The number of days for which backups must be kept. */ 'keepAllBackupsForDays' => 7, /* * The number of days for which daily backups must be kept. */ 'keepDailyBackupsForDays' => 16, /* * The number of weeks for which one weekly backup must be kept. */ 'keepWeeklyBackupsForWeeks' => 8, /* * The number of months for which one monthly backup must be kept. */ 'keepMonthlyBackupsForMonths' => 4, /* * The number of years for which one yearly backup must be kept. */ 'keepYearlyBackupsForYears' => 2, /* * After cleaning up the backups remove the oldest backup until * this amount of megabytes has been reached. */ 'deleteOldestBackupsWhenUsingMoreMegabytesThan' => 5000, ], ], ]; ### 修改配置文件,上传到阿里云oss 'destination' => [ /* * The disk names on which the backups will be stored. */ 'disks' => [ 'oss', ], ], ### 添加队列处理执行备份 创建文件 `/app/Jobs/BackupPublish.php` 添加代码: command = $command; $this->value = $value; } /** * Execute the job. * * @return void */ public function handle() { //使用队列处理备份操作 if(empty($this->value)) { Artisan::call($this->command); } else { Artisan::call($this->command, [ $this->value => true, ]); } //Artisan::call('backup:run --only-db'); } } ?> ### 添加任务调度 修改文件 `app/Console/Kernel.php` 添加代码: /** * Define the application's command schedule. * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { // $schedule->command('backup:clean')->weekly()->at('01:00'); //使用任务调度 定时任务处理备份和清空 $schedule->call(function () { $upload = new \App\Services\Upload(); $upload->deleteDirectory('backup'); })->weekly()->at('01:00'); $schedule->command('backup:run')->weekly()->at('02:00'); } 执行命令: `* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1 `