Laravel框架——任務調度(cron)


准備:

  在服務的/var/spool/cron/root文件中添加代碼

cd /var/spool/cron/root

   添加以下代碼

* * * * * phppath 項目路徑/artisan schedule:run >> /dev/null 2>&1

   打印出定時任務列表查看是否添加成功

crontab -u root -l

如果已經使用了絕對路徑還是不執行,那就直接在命令行輸入/usr/local/php/bin/php /data/wwwroot/test/artisan schedule:run 1>> /dev/null 2>&1,看看有沒有執行,如果沒有執行,那就是laravel代碼的問題 

如果不知道php在什么地方,在命令行輸入which php,就會提示你php安裝在什么位置了。

 

1.創建Class 

php artisan make:console Classname

 2.修改Classname.php文件

protected $signature = 'classname';

   事件操作寫在handle()方法中

3.修改Kernel.php

  添加$commands數組:

Commands\Classname::class,

  在schedule方法中調用以及設置條件:

$schedule->command('classname')
                  ->hourly();

 

 

everyMinute();      每分鍾運行一次任務

everyFiveMinutes();   每五分鍾運行一次任務

everyTenMinutes();   每十分鍾運行一次任務

everyThirtyMinutes();  每三十分鍾運行一次任務

hourly();         每小時運行一次任務

daily();              每天凌晨零點運行任務

dailyAt('13:00');    每天13:00運行任務

twiceDaily(1, 13);    每天1:00 & 13:00運行任務

weekly();          每周運行一次任務

monthly();        每月運行一次任務

quarterly();       每個季度運行一次

yearly();        每年運行一次

如果需要某天的那個時間:

  ->at('13:00')  //13點才會執行

上面這些方法可以和額外的約束一起聯合起來創建一周特定時間運行的更加細粒度的調度,例如:

weekdays();  只在工作日運行任務

sundays();    每個星期天運行任務

mondays()    每個星期一運行任務

tuesdays();   每個星期二運行任務

wednesdays();  每個星期三運行任務

thursdays();   每個星期四運行任務

fridays();      每個星期五運行任務

saturdays();   每個星期六運行任務

when(Closure); 基於特定測試運行任務

when方法用於限制任務在通過給定測試之后運行。換句話說,如果給定閉包返回true,只要沒有其它約束條件阻止任務運行,該任務就會執行:

$schedule->command('inspire')
                  ->hourly()
                  ->when(function () {
                    return true;
             });

 reject方法和when相反,如果reject方法返回true,調度任務將不會執行。

 

避免任務重疊

默認情況下,即使前一個任務仍然在運行調度任務也會運行,要避免這樣的情況,可使用withoutOverlapping方法:

$schedule->command('inspire')
                  ->hourly()
                  ->withoutOverlapping();

 

Laravel調度器為處理調度任務輸出提供了多個方便的方法。首先,使用sendOutputTo方法,你可以發送輸出到文件以便稍后檢查:

$schedule->command('emails:send')
         ->daily()
         ->sendOutputTo($filePath);

 

任務鈎子:

  使用beforeafter方法,你可以指定在調度任務完成之前和之后要執行的代碼:

$schedule->command('emails:send')
         ->daily()
         ->before(function () {
             // Task is about to start...
         })
         ->after(function () {
             // Task is complete...
         });

 

錯誤檢查:

  如果按照上面寫了,還是沒有定時執行:運行pgrep crond,看看是否打印出PID,如果沒有就意味着沒有運行

  運行crond restart重啟cron


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM