首先,项目根目录执行命令如下:
php artisan make:command BackupDatabase
BackupDatabase 可根据习惯自由命名
该命令用于创建一个 laravel 的可执行命令(laravel Artisan 命令行),将会在项目目录生成如下文件“app\Console\Commands\BackupDatabase.php”,文件内容如下:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class BackupDatabase extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'command:name';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//
}
}
我们用mysql自带的 mysqldump 命令进行数据库的备份
mysqldump -h连接地址 -p端口 -u登录用户 -p密码 数据库 > 存放文件
我们将 BackupDatabase.php 做如下修改:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
class BackupDatabase extends Command
{
protected $signature = 'db:backup';
protected $description = 'Backup the database';
protected $process;
public function __construct()
{
parent::__construct();
//将备份文件放至 “storage/backup”
$dirPath = storage_path('backup/');
if (!file_exists($dirPath)) {
mkdir($dirPath);
}
//备份文件名以当前日期命名
$filePath = $dirPath.date('Y-m-d').'.sql' ;
$this->process = new Process(sprintf(
'mysqldump -h%s -p%s -u%s -p%s %s > %s',
env('DB_HOST'),
env('DB_PORT'),
env('DB_USERNAME'),
env('DB_PASSWORD'),
env('DB_DATABASE'),
$filePath
));
}
public function handle()
{
try {
$this->process->mustRun();
$this->info('The backup has been proceed successfully.');
} catch (ProcessFailedException $exception) {
file_put_contents('error.log',$exception->getMessage());
$this->error('The backup process has been failed.'.$exception->getMessage());
}
}
}
到了这一步,已经可以备份了,我们尝试在项目根目录执行如下命令:
php artisan db:backup:
如执行失败,根据错误信息自行排查。
我们希望每天定时备份,这个时候可以采用laravel的任务调度,当然也可以用其他的方法定时调用,如直接用 “crontab” ,laravel的任务调度本身就是采用的 “crontab”。
启动调度器:
lliaoxiuandeMBP:zx.zysoft.com lxy$ crontab -e
添加如下代码
* * * * * php /usr/local/var/www/zx.zysoft.com/artisan schedule:run >> /dev/null 2>&1
/usr/local/var/www/zx.zysoft.com/ 为项目根目录
schedule:run 为 laravel 自带命令行 用户执行任务调度
此命令加入 crontab ,crontab会每分钟调用一次 Laravel 命令调度器
然后编写laravel定时脚本:
修改 app/Console/Kernel.php,commands与schedule添加如下:
protected $commands = [
// 备份数据库
\App\Console\Commands\BackupDatabase::class
];
protected function schedule(Schedule $schedule)
{
// 每天凌晨 1 点执行
$schedule->command('db:backup')->dailyAt('01:00');
}
ok,laravel 备份数据库就是这么简单