利用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); | 基于特定测试运行任务 |