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