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```
相关推荐
深海呐14 分钟前
Android AlertDialog圆角背景不生效的问题
android
ljl_jiaLiang15 分钟前
android10 系统定制:增加应用使用数据埋点,应用使用时长统计
android·系统定制
花花鱼16 分钟前
android 删除系统原有的debug.keystore,系统运行的时候,重新生成新的debug.keystore,来完成App的运行。
android
小诸葛的博客40 分钟前
pg入门1——使用容器启动一个pg
数据库
大熊程序猿2 小时前
python 读取excel数据存储到mysql
数据库·python·mysql
落落落sss2 小时前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle
jnrjian2 小时前
Oracle 启动动态采样 自适应执行计划
数据库·oracle
lamb张2 小时前
MySQL锁
数据库·mysql
ForRunner1232 小时前
使用 Python 高分解决 reCAPTCHA v3 的指南
数据库·python·microsoft