启动调度器
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
宝塔
su -c "cd /www/wwwroot/v2.com && php artisan schedule:run >> /dev/null 2>&1" -s /bin/sh www
创建脚本文件
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);