laravel 凌晨0点 导出数据库

一、创建导出模型

<?php
namespace  App\Models;

use Illuminate\Support\Facades\DB;

class  DbBackup
{
    private $table;

    public function __construct()
    {
        $this->table = env('DB_DATABASE');
    }

    public function run($file = '')
    {
        $file       = !$file ? public_path($this->table.'.mysql') : $file;
        $tables     = DB::select('SHOW TABLES FROM '.$this->table);
        $tableName  = 'Tables_in_'.$this->table;

        $info  = "-- ----------------------------\r\n";
        $info .= "-- 日期:".date("Y-m-d H:i:s",time())."\r\n";
        $info .= "-- 本程序不适合处理超大量数据\r\n";
        $info .= "-- ----------------------------\r\n\r\n";
        file_put_contents($file,$info,FILE_APPEND);

        //将每个表的表结构导出到文件
        foreach($tables as $val)
        {
            $sql    = "show create table ".$val->$tableName;
            $row    = DB::select($sql);
            $info   = "-- ----------------------------\r\n";
            $info   .= "-- Table structure for `".$val->$tableName."`\r\n";
            $info   .= "-- ----------------------------\r\n";
            $info   .= "DROP TABLE IF EXISTS `".$val->$tableName."`;\r\n";
            $temp   = 'Create Table';
            $sqlStr = $info.$row[0]->$temp.";\r\n\r\n";
            //追加到文件
            file_put_contents($file,$sqlStr,FILE_APPEND);
        }

        //将每个表的数据导出到文件
        foreach($tables as $val)
        {
            $sql = "select * from ".$val->$tableName;
            $res = \DB::select($sql);
            //如果表中没有数据,则继续下一张表
            if(count($res)<1) continue;
            //
            $info = "-- ----------------------------\r\n";
            $info .= "-- Records for `".$val->$tableName."`\r\n";
            $info .= "-- ----------------------------\r\n";
            file_put_contents($file,$info,FILE_APPEND);
            //读取数据

            foreach ($res as $key => $value)
            {
                $sqlStr     = "INSERT INTO `".$val->$tableName."` VALUES (";
                $sqlTemp    = '';
                foreach(get_object_vars($value) as $v)
                {
                    $sqlTemp = !$sqlTemp ? "'".$v ."'" : $sqlTemp . ',\''.$v."'";
                }
                $sqlStr =  $sqlStr . $sqlTemp .");\r\n";
                file_put_contents($file,$sqlStr,FILE_APPEND);
            }
            file_put_contents($file,"\r\n",FILE_APPEND);
        }
        return $file;
    }
}

二、创建任务文件

php artisan make:command Dbsql

三、任务业务逻辑

<?php

namespace App\Console\Commands;

use App\Models\DbBackup;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;

class DbSql extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:dbsql';

    /**
     * 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()
    {
        $dir = public_path('upload/backup/');
        if(!is_dir($dir)) mkdir($dir);
        //因为要每天备份数据库,所以生成前清楚文件夹下的前一天sql
        File::cleanDirectory(public_path('upload/backup'));
        $file_name = date('Y-m-d').'.sql';
        $file_path = $dir.$file_name;
        $backup = new DbBackup();
        $backup->run($file_path);
        //下面为下载sql文件
        header('Content-type: application/sql');
        header("Content-Disposition: attachment; filename=\"{$file_name}\"");
        readfile($file_path);
        return "数据库导出完成";
    }
}

此时就可以对任务进行测试php artisan command:dbsql

四、高级配置任务的调度(可以对多个任务进行封装执行一次命令)

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     * @info 配置command调度类
     */
    protected $commands = [
        \App\Console\Commands\DbSql::class,
        \App\Console\Commands\gradeData::class,
        \App\Console\Commands\schoolCountData::class,
        //
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     * @info 执行任务调度
     */
    protected function schedule(Schedule $schedule)
    {
         $schedule->command('command:dbsql')
                      //每五分钟
//                    ->everyFiveMinutes();
                    //每天凌晨0点
                    ->daily();
         $schedule->command('command:gradeData')
//                    ->everyFiveMinutes();
                    ->daily();
         $schedule->command('command:schoolData')
//             ->everyFiveMinutes();
                    ->daily();
        //          ->hourly();

    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

五、配置cron

执行crontab -e

1 * * * * php /var/www/sc/artisan DelRecycleAsset >> /dev/null 2>&1
0 0 * * * php /var/www/ty/artisan schedule:run >> /dev/null 2>&1```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值