启动调度器
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
创建脚本文件
php artisan make:command Classname --command=yjq:test
# app/Console/Commands/Classname
class Classname extends Command
{
protected $signature = 'yjq:test {param_name} {--option_name=}';
protected $description = 'Command description';
public function __construct()
{
parent::__construct();
}
public function handle()
{
//这里做任务的具体处理,可以用模型
Log::info('任务调度二'.date('Y-m-d H:i:s',time()));
}
}
注册脚本
# App\Console\Kernel
class Kernel extends ConsoleKernel
{
protected $commands = [
\App\Console\Commands\Classname::class
];
//获取计划事件默认使用的时区。
protected function scheduleTimezone()
{
return 'America/Chicago';
}
protected function schedule(Schedule $schedule)
{
//方法一:
$schedule->call(function (){
Log::info('任务调度一:闭包形式');
})->everyMinute();
//方法二
$schedule->command('yjq:test')->everyMinute();
$schedule->command('inspire')->everyMinute();
$this->argument('param_name');
$this->option('option_name');
# 任务钩子
$schedule->command('emails:send')
->daily()
->before(function () {
// 任务即将开始...
})
->after(function () {
// 任务完成...
});
$schedule->command('emails:send')
->daily()
->onSuccess(function () {
// 任务成功...
})
->onFailure(function () {
// 任务失败...
});
}
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}
# 方法一,方法二 用法
php artisan schedule:run >> null 2>&1
# 方法二 用法
php artisan yjq:test
# routes/console.php
Artisan::command('inspire', function () {
\Illuminate\Support\Facades\Log::alert('-------sfdasdf-------');
})->describe('Display an inspiring quote');
Artisan::command('build {project}', function ($project) {
\Illuminate\Support\Facades\Log::alert("Building {$project}!");
});
# 调用脚本时传递参数 必填参数:用{}指定
protected $signature = 'command:name {param_name}';
# 调用
$this->argument('param_name');
# 调用脚本时传递参数 选填参数:用{--}指定
protected $signature = 'command:name {--option_name=}' #option_name默认为空;
# 调用
$this->option('option_name');
定时任务
# ubuntu 查看php程序位置
which php
# windows 查看php程序位置
where php
crontab -e
crontab -l
* * * * * /Applications/XAMPP/xamppfiles/bin/php /Applications/XAMPP/xamppfiles/htdocs/blog/artisan schedul:run >> /dev/null 2>&1
crontab -r
队列任务调度
$schedule->job(new Heartbeat)->everyFiveMinutes();
// 分发任务到「heartbeats」队列...
$schedule->job(new Heartbeat, 'heartbeats')->everyFiveMinutes();
Shell 调度命令
$schedule->exec('node /home/forge/script.js')->daily();
调度频率设置
方法 |
描述 |
->cron('* * * * *'); |
自定义 Cron 计划执行任务 |
->everyMinute(); |
每分钟执行一次任务 |
->everyFiveMinutes(); |
每五分钟执行一次任务 |
->everyTenMinutes(); |
每十分钟执行一次任务 |
->everyFifteenMinutes(); |
每十五分钟执行一次任务 |
->everyThirtyMinutes(); |
每三十分钟执行一次任务 |
->hourly(); |
每小时执行一次任务 |
->hourlyAt(17); |
每小时第 17 分钟执行一次任务 |
->daily(); |
每天午夜执行一次任务(译者注:每天零点) |
->dailyAt('13:00'); |
每天 13 点执行一次任务 |
->twiceDaily(1, 13); |
每天 1 点及 13 点各执行一次任务 |
->weekly(); |
每周执行一次任务 |
->weeklyOn(1, '8:00'); |
每周一的 8 点执行一次任务 |
->monthly(); |
每月执行一次任务 |
->monthlyOn(4, '15:00'); |
每月 4 号的 15 点执行一次任务 |
->quarterly(); |
每季度执行一次任务 |
->yearly(); |
每年执行一次任务 |
->timezone('America/New_York'); |
设置时区 |
方法 |
描述 |
->weekdays(); |
限制任务在工作日执行 |
->weekends(); |
限制任务在周末执行 |
->sundays(); |
限制任务在周日执行 |
->mondays(); |
限制任务在周一执行 |
->tuesdays(); |
限制任务在周二执行 |
->wednesdays(); |
限制任务在周三执行 |
->thursdays(); |
限制任务在周四执行 |
->fridays(); |
限制任务在周五执行 |
->saturdays(); |
限制任务在周六执行 |
->between($start, $end); |
限制任务在 $start 和 $end 区间执行 |
->when(Closure); |
限制任务在闭包返回为真时执行 |
->environments($env); |
限制任务在特定环境中执行 |
环境限制
$schedule->command('emails:send')
->daily()
->environments(['staging', 'production']);
时区
$schedule->command('report:generate')
->timezone('America/New_York')
->at('02:00')
避免任务重复
$schedule->command('emails:send')->withoutOverlapping(10);
任务只运行在一台服务器上
$schedule->command('report:generate')
->fridays()
->at('17:00')
->onOneServer();
后台任务
$schedule->command('analytics:report')
->daily()
->runInBackground();
维护模式
$schedule->command('emails:send')->evenInMaintenanceMode();
任务输出
$schedule->command('emails:send')
->daily()
->sendOutputTo($filePath);
$schedule->command('foo')
->daily()
->sendOutputTo($filePath)
->emailOutputTo('foo@example.com');
$schedule->command('foo')
->daily()
->emailOutputOnFailure('foo@example.com');
Pinging 网址
$schedule->command('emails:send')
->daily()
->pingBefore($url)
->thenPing($url);
$schedule->command('emails:send')
->daily()
->pingBeforeIf($condition, $url)
->thenPingIf($condition, $url);
$schedule->command('emails:send')
->daily()
->pingOnSuccess($successUrl)
->pingOnFailure($failureUrl);