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```
相关推荐
故渊at2 分钟前
系列二:MVVM 深度实战与项目重构 | 第7篇 LiveData & StateFlow 状态管理实战:从“粘包弹”到“丝滑流式”
android·重构
是阿建吖!11 分钟前
【Linux】信号
android·linux·c语言·c++
>no problem<17 分钟前
基于cola5.0的基础设施层的多数据库切换方案思路
数据库·spring boot·mybatisplus·cola5.0·数据库迁移适配
OceanBase数据库官方博客20 分钟前
OceanBase 赋能央国企:从发电到用电的全链路业务承载
数据库·oceanbase
瀚高PG实验室1 小时前
pgsql-ogr-fdw
数据库·postgresql·瀚高数据库·highgo
IvorySQL1 小时前
PostgreSQL 技术日报 (6月5日)|PG19 Beta1 上线,PGConf.PL 2026开启征稿
数据库·postgresql·区块链
abcy0712132 小时前
pycharm python sqlalchemy mysql增删改查实例csdn
数据库·oracle
无风听海2 小时前
IndexedDB 深度指南 浏览器中的事务型对象数据库
前端·数据库
alexhilton2 小时前
AppFunctions:让你的Android应用更容易被AI智能体发现
android·kotlin·android jetpack
qq3621967052 小时前
APK文件签名校验教程:验证APK真伪的完整方法
android·智能手机