利用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); | 基於特定測試運行任務 |