laravel 凌晨0点 导出数据库

一、创建导出模型

php 复制代码
<?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;
    }
}

二、创建任务文件

bash 复制代码
php artisan make:command Dbsql

三、任务业务逻辑

php 复制代码
<?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 复制代码
<?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

bash 复制代码
1 * * * * php /var/www/sc/artisan DelRecycleAsset >> /dev/null 2>&1
0 0 * * * php /var/www/ty/artisan schedule:run >> /dev/null 2>&1```
相关推荐
三少爷的鞋19 分钟前
Android 协程时代,Handler 应该退休了吗?
android
NineData9 小时前
NineData 迁移评估功能正式上线
数据库·dba
火柴就是我14 小时前
让我们实现一个更好看的内部阴影按钮
android·flutter
NineData14 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师17 小时前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
砖厂小工20 小时前
用 GLM + OpenClaw 打造你的 AI PR Review Agent — 让龙虾帮你审代码
android·github
全栈老石21 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
张拭心21 小时前
春节后,有些公司明确要求 AI 经验了
android·前端·人工智能
张拭心21 小时前
Android 17 来了!新特性介绍与适配建议
android·前端
Kapaseker1 天前
Compose 进阶—巧用 GraphicsLayer
android·kotlin