过去想给一个脚本创建计划任务,得登陆服务器执行crontab -e
,或编辑/etc/crontab
,每加一个脚本都得重复此步骤。
现在有了任务调度,你只需在服务器上配置一条
代码语言:javascript复制* * * * * cd /你的项目路径 && php artisan schedule:run >> /dev/null 2>&1
后面你再加多少脚本都无需到服务器处理
定义调度
你可以在 AppConsoleKernel
类的 schedule
方法中定义所有的调度任务。
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
//在test环境每分钟执行一次文章发布命令,不重叠的(如果一个任务执行缓慢,即使到下一个时间点了,也要等上一个时间点到任务执行完再执行,避免重叠)
$schedule->command('article:publish')->everyMinute()->withoutOverlapping()->environments(['testing']);
}
...
代码语言:javascript复制#闭包调度
$schedule->call(function () {
DB::table('recent_users')->delete();
})->daily();
#除了调用闭包这种方式来调度外,你还可以调用 `可调用对象`. 可调用对象是简单的 PHP 类,包含一个 `__invoke` 方法:
$schedule->call(new DeleteRecentUsers)->daily();
查看已有的计划任务
代码语言:javascript复制php artisan schedule:list
Artisan 命令调度
代码语言:javascript复制use AppConsoleCommandsSendEmailsCommand;
$schedule->command('emails:send Taylor --force')->daily();
$schedule->command(SendEmailsCommand::class, ['Taylor', '--force'])->daily();
队列任务调度
代码语言:javascript复制use AppJobsHeartbeat;
$schedule->job(new Heartbeat)->everyFiveMinutes();
// 分发任务到「heartbeats」队列及「sqs」连接...
$schedule->job(new Heartbeat, 'heartbeats', 'sqs')->everyFiveMinutes();
Shell 命令调度
代码语言:javascript复制$schedule->exec('node /home/forge/script.js')->daily();
调度频率选项
代码语言:javascript复制->daily(); 每天 00:00 执行一次任务
运行调度程序
代码语言:javascript复制* * * * * cd /你的项目路径 && php artisan schedule:run >> /dev/null 2>&1
本地运行调度程序
代码语言:javascript复制php artisan schedule:work
任务输出
代码语言:javascript复制$schedule->command('emails:send')
->daily()
->appendOutputTo($filePath);
任务钩子
代码语言:javascript复制use IlluminateSupportStringable;
$schedule->command('emails:send')
->daily()
->onSuccess(function (Stringable $output) {
// 任务执行成功。。。
})
->onFailure(function (Stringable $output) {
// 任务执行失败。。。
});
Pinging 网址
代码语言:javascript复制$schedule->command('emails:send')
->daily()
->pingOnSuccess($successUrl)
->pingOnFailure($failureUrl);
参考
https://learnku.com/docs/laravel/9.x/scheduling/12238