Laravel定时任务操作数据库

因为项目中有个几十万条记录的表,而且每天都在增加,所以想到了使用laravel定时任务,在凌晨的时候把这张表的数据转移到别的表中.

服务器中设置启动定时任务的条目

使用Xshell或者其他的SSH工具登录服务器之后
通过 crontab -e 新增或编辑Cron条目
通过 crontab -l 查看已存在的Cron条目
laravel5的Kernel/schedule 共用一个Cron条目

Cron条目模板和示例

* * * * * php /项目地址/artisan schedule:run >> /dev/null 2>&1
* * * * * php /website/lanchogn_test/artisan schedule:run >> /root/website_lanchong.log 2>&1

在App/console/Kernel类的schedule方法里设置定时任务的路径和执行时间

可以是这种直接操作数据表的.

    protected function schedule(Schedule $schedule)
    {
        $schedule->call(function () {
            DB::table('recent_users')->delete();
        })->daily();
    }

也可以引入在别的地方写好的方法:

protected function schedule(Schedule $schedule)
    {
        //转移过期数据;
        $schedule->call(function(){
            $reports = new Reports();
            $reports->transferData();
        })->everyTenMinutes()->between('2:00','4:00');
    }

别忘了把引入的类use一下 use App\common\Reports;

在use的那个类的方法里写需要做的事情

示例:

    //定时执行转移一个月之前的数据(每天执行一次)
    public function transferData()
    {
        set_time_limit(200);
        DB::beginTransaction();//开启事务;
        try {
            //1.转移
            $mothTime = date("Y-m-d H:i:s", strtotime("-1 month"));
            while (true) { 
                $row_one = DB::table('xxxxxx')->where('release_date', '<', $mothTime)->first();
                if ($row_one) {
                    $row_one = (array)$row_one;
                    $aaa = $row_one['message_id'];

                    $row_two = DB::table('yyyyyy')->insert($row_one);//转移
                    $row_three = DB::table('jmcm_messages')->where('message_id', $aaa)->delete();//删除
                    if ($row_two && $row_three) {
                        DB::commit();
                    } else {
                        DB::rollBack();
                        break;
                    }
                }else {
                    break;
                }
            }
        }catch (\Exception $e){

            DB::rollBack();
        }
    }

一些常用的选项

方法 描述
->cron(’* * * * *’); 在自定义Cron调度上运行任务
->everyMinute(); 每分钟运行一次任务
->everyFiveMinutes(); 每五分钟运行一次任务
->everyTenMinutes(); 每十分钟运行一次任务
->everyFifteenMinutes(); 每十五分钟运行一次任务
->everyThirtyMinutes(); 每三十分钟运行一次任务
->hourly(); 每小时运行一次任务
->hourlyAt(17); 每小时第十七分钟运行一次任务
->daily(); 每天凌晨零点运行任务
->dailyAt(‘13:00’); 每天13:00运行任务
->twiceDaily(1, 13); 每天1:00 & 13:00运行任务
->weekly(); 每周运行一次任务
->monthly(); 每月运行一次任务
->monthlyOn(4, ‘15:00’); 每月4号15:00运行一次任务
->quarterly(); 每个季度运行一次
->yearly(); 每年运行一次
->timezone(‘America/New_York’); 设置时区

灵活使用


$schedule->call(function(){
      	 //每天凌晨两点到四点 每十分钟执行一次...
        })->everyTenMinutes()->between('2:00','4:00');

$schedule->call(function () {
    // 每周星期一13:00运行一次...
})->weekly()->mondays()->at('13:00');


// 工作日的上午8点到下午5点每小时运行...
$schedule->command('foo')
         ->weekdays()
         ->hourly()
         ->timezone('America/Chicago')
         ->between('8:00', '17:00');

额外的调度约束列表

方法 描述
->weekdays(); 只在工作日运行任务
->sundays(); 每个星期天运行任务
->mondays(); 每个星期一运行任务
->tuesdays(); 每个星期二运行任务
->wednesdays(); 每个星期三运行任务
->thursdays(); 每个星期四运行任务
>fridays(); 每个星期五运行任务
->saturdays(); 每个星期六运行任务
->between($start, $end); 基于特定时间段运行任务
->when(Closure); 基于特定测试运行任务
原创文章 7 获赞 7 访问量 994

猜你喜欢

转载自blog.csdn.net/The_My_World/article/details/106095286