【转】Laravel框架——任务调度(cron)
准备:
在服务的/var/spool/cron/root文件中添加代码
1
|
cd / var /spool/cron/root |
添加以下代码
1
|
* * * * * phppath 项目路径/artisan schedule:run >> /dev/null 2>&1 |
打印出定时任务列表查看是否添加成功
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
1
|
php artisan make:console Classname |
2.修改Classname.php文件
1
|
protected $signature = 'classname' ; |
事件操作写在handle()方法中
3.修改Kernel.php
添加$commands数组:
1
|
Commands\Classname:: class , |
在schedule方法中调用以及设置条件:
1
2
|
$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
,只要没有其它约束条件阻止任务运行,该任务就会执行:
1
2
3
4
5
|
$schedule ->command( 'inspire' ) ->hourly() ->when( function () { return true; }); |
reject方法和when相反,如果reject方法返回true,调度任务将不会执行。
避免任务重叠
默认情况下,即使前一个任务仍然在运行调度任务也会运行,要避免这样的情况,可使用withoutOverlapping
方法:
1
2
3
|
$schedule ->command( 'inspire' ) ->hourly() ->withoutOverlapping(); |
Laravel调度器为处理调度任务输出提供了多个方便的方法。首先,使用sendOutputTo
方法,你可以发送输出到文件以便稍后检查:
1
2
3
|
$schedule ->command( 'emails:send' ) ->daily() ->sendOutputTo( $filePath ); |
任务钩子:
使用before
和after
方法,你可以指定在调度任务完成之前和之后要执行的代码:
1
2
3
4
5
6
7
8
|
$schedule ->command( 'emails:send' ) ->daily() ->before( function () { // Task is about to start... }) ->after( function () { // Task is complete... }); |
错误检查:
如果按照上面写了,还是没有定时执行:运行pgrep crond,看看是否打印出PID,如果没有就意味着没有运行
运行crond restart重启cron