#spatie/laravel-backup 之数据库备份

2018-10-16  本文已影响0人  riyihu

使用依赖:spatie/laravel-backup
运行环境:ubuntu
php版本:7.2

备注:laravel 数据库&文件备份
首先安装package composer require spatie/laravel-backup
文档链接 https://docs.spatie.be/laravel-backup/v5/introduction

注册服务提供者(config/app.php):

'providers' => [
    // ...
    Spatie\Backup\BackupServiceProvider::class,
];

发布配置文件config/laravel-backup.php
php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"

修改config/backup.php

'disks' => [
                'local',              //备份文件储存位置 见 filesystems.php
  ],
'filename_prefix' => 'mydata-backup', //备份文件的前缀
'mail' => [
            'to' => '123456@qq.com',  //备份等操作的结果通知邮箱(成功/失败)
],

其他地方使用的默认配置
配置好之后就可以开始备份了
在项目根目录下打开powershell 运行

php artisan backup:run               //备份数据库和所有文件
php artisan backup:run --only-db    //只备份数据库
php artisan backup:run --only-file  //只备份文件
'backup:run {--filename=} {--only-db} {--db-name=*} {--only-files} {--only-to-disk=} {--disable-notifications}';
........

无论备份成功或者失败都会有邮件通知到配置的邮箱

当然我们并不用每次去用命令行来执行备份
可用laravel 的Artisan来执行
备份 ,显示,删除,下载 demo:

<?php
namespace App\Http\Controllers\Backup;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class BackupController extends Controller
{   

    public function backupList()
    {   
        $disk = Storage::disk('local');
        $directory = '/edu-data-backup';
       // 获取目录下的文件
        $files = $disk->files($directory);
       // //获取目录下的所有文件(包括子目录下的文件)
       //  $allFiles = $disk->allFiles($directory);
        //dd($files);
        $db_zips = [];
        foreach ($files as $k => $v) {
            $db_zips[$k]['name'] = substr($v,strpos($v,'/')+1);
            $db_zips[$k]['size'] = $this->count_size(Storage::size($v));            //文件大小
            $db_zips[$k]['time'] = date('Y-m-d H:i:s', Storage::lastModified($v)); //最后修改时间
        }
        return view('admin.backup.backup',['db_zips'=>$db_zips]);
    }

   
    //删除
    public function delzip(Request $request)
    {
        // 取到磁盘实例
        $filename = $request->input('filename');
        //dd($filename);
        $disk = Storage::disk('local');
        $directory = '/edu-data-backup';
        // 删除单条文件
        $exists = $disk->exists($directory.'/'.$filename);
        if (!$exists) {
            $arr = [
                'error' => 1,
                'msg' => '文件不存在'
            ];
            return $arr;
        }

        $del = $disk->delete($directory.'/'.$filename);
        // 删除多条文件
        //$disk->delete(['test22.txt', 'icon.jpg']);
        if ($del) {
            $arr = [
                'error' => 0,
                'msg' => '删除成功'
            ];
        } else {
            $arr = [
                'error' => 1,
                'msg' => '删除失败'
            ];
        }
        return $arr;
        
    }
   
    public function dataBackup()
    {   
        //备份数据库
        $backup = Artisan::call('backup:run', ['--only-db'=>true]);
        //这里注意 参数是以数组的形式
        if ($backup==0) {
            $arr = [
                'error' => 0,
                'msg' => '数据库备份成功'
            ];
        } else {
            $arr = [
                'error' => 1,
                'msg' => '数据库备份失败'
            ];
        }
        return $arr;
    }


   public function downloadZip(Request $request)
   {
        $filename = $request->route('filename');
        $disk = Storage::disk('local');
        $directory = '/edu-data-backup';
        $exists = $disk->exists($directory.'/'.$filename);
        if (!$exists) {
            $arr = [
                'error' => 1,
                'msg' => '文件不存在'
            ];
        }
        //完整路径下载
        return response()->download(public_path().'/uploads'.$directory.'/'.$filename);   
   }

    //单位换算
    public function count_size($bit)
    {
        $type = array('Bytes','KB','MB','GB','TB');
        for($i = 0; $bit >= 1024; $i++)//单位每增大1024,则单位数组向后移动一位表示相应的单位
        {
            $bit/=1024;
        }
        return (floor($bit*100)/100).$type[$i];//floor是取整函数,为了防止出现一串的小数,这里取了两位小数
    }

}
注:windows下则还需要配置
mysqldump的路径

这里是手动备份
当然也可以使用laravel的定时任务去定时备份
像这样

 protected function schedule(Schedule $schedule)
   {
        //每天凌晨三点开始备份
        $schedule->command('backup:run')->daily()->at('03:00');
   }
上一篇下一篇

猜你喜欢

热点阅读