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); 基於特定測試運行任務
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章