美文网首页
#spatie/laravel-backup 之数据库备份

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

作者: riyihu | 来源:发表于2018-10-16 16:43 被阅读0次

    使用依赖: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');
       }
    

    相关文章

      网友评论

          本文标题:#spatie/laravel-backup 之数据库备份

          本文链接:https://www.haomeiwen.com/subject/zpphzftx.html