任务调度
任务调度:首先需要在Linux上面创建一条计划任务,该计划任务是每分钟调用laravel的命令
Linux上的命令 crontab -e
输入以下内容:
* * * * * php /项目目录/artisan schedule:run >> /dev/null 2>&1
或者你想记录日志,日志没太大意义
* * * * * cd /www/php_demo_dev && /usr/local/bin/php artisan schedule:run >> /www/php_demo_dev/storage/logs/crontab-www-data.log
创建一个命令类
php artisan make:command Test
<?php
namespace App\Console\Commands;
use App\Models\Wx\WxUser;
use Illuminate\Console\Command;
class Test extends Command {
/**
* 命令名称
*
* @var string
*/
protected $signature = 'test';
/**
* 命令描述
*
* @var string
*/
protected $description = '测试的命令';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct() {
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle() {
for ($i = 0; $i < 10; $i++) {
$data = [
'openid' => md5(microtime(true) . mt_rand(1, 9)),
'unionid' => md5(microtime(true) . mt_rand(1, 9)),
'state' => mt_rand(1, 8),
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
];
$temp = WxUser::create($data);
// 输出信息
$this->info($temp->id);
}
}
}
指定运行的时间间隔(调度)
然后在 app\Console\Kernel.php
文件中指定调度
protected function schedule(Schedule $schedule) {
$schedule->command('img_to_text')->everyMinute();//每分钟运行一次任务
$schedule->command('send_kf_msg')->everyFiveMinutes();//每五分钟运行一次任务
}
方法 | 描述 |
---|---|
->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('Asia/Shanghai'); | 设置时区 |
->weekdays(); | 只在工作日运行任务 |
->sundays(); | 每个星期天运行任务 |
->mondays(); | 每个星期一运行任务 |
->tuesdays(); | 每个星期二运行任务 |
->wednesdays(); | 每个星期三运行任务 |
->thursdays(); | 每个星期四运行任务 |
->fridays(); | 每个星期五运行任务 |
->saturdays(); | 每个星期六运行任务 |
->between($start, $end); | 基于特定时间段运行任务 |
->when(Closure); | 基于特定测试运行任务 |
手动运行
php artisan test
避免任务重叠
- 默认情况下,即使前一个任务仍然在运行调度任务也会运行,要避免这样的情况,可使用 withoutOverlapping 方法
- 可以指定”without overlapping”锁失效前的分钟数,默认情况下,这个锁会在 24 小时后失效
$schedule->command('emails:send')->withoutOverlapping();
在单台服务器上运行
要告知任务只在单台服务器上运行,在定义调度任务时使用 onOneServer 方法即可。第一台获取到该任务的服务器会给任务上一把原子锁以阻止其 他服务器同时运行该任务:
$schedule->command('report:generate')
->fridays()
->at('17:00')
->onOneServer();
任务输出
- 使用 sendOutputTo 方法,你可以发送输出到文件以便稍后检查
- 如果你想要追加输出到给定文件,可以使用 appendOutputTo 方法
$schedule->command('emails:send')
->daily()
->appendOutputTo($filePath);
任务钩子
使用 before 和 after 方法,你可以指定在调度任务完成之前和之后要执行的代码
$schedule->command('emails:send')
->daily()
->before(function () {
// 任务即将开始...
})
->after(function () {
// 任务已经完成...
});