💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 定时任务 ## 定时任务 > **注意**:有关如何设置调度程序任务的说明,请参阅[安装指南](https://octobercms.com/docs/setup/installation#crontab-setup)。 ### 定义时间表 * 在`lugin注册类`中的`registerSchedule`方法来定义所有计划的任务。 * 参数`$schedule`,定义命令及其频率 * 示例,`Closure`每天调用一次。`Closure`将执行数据库查询以清除表: ~~~ class Plugin extends PluginBase { [...] public function registerSchedule($schedule) { $schedule->call(function () { \Db::table('recent_users')->delete(); })->daily(); } } ~~~ 使用`command`方法来调度控制台命令: ~~~ $schedule->command('cache:clear')->daily(); ~~~ 该`exec`命令可用于向操作系统发出命令: ~~~ $schedule->exec('node /home/acme/script.js')->daily(); ~~~ ### 安排频率选项 当然,您可以为任务分配各种时间表: | 方法 | 描述 | | --- | --- | | `->cron('* * * * *');` | 按照自定义Cron时间表运行任务 | | `->everyMinute();` | 每分钟运行一次任务 | | `->everyFiveMinutes();` | 每五分钟运行一次任务 | | `->everyTenMinutes();` | 每十分钟运行一次任务 | | `->everyThirtyMinutes();` | 每三十分钟运行一次任务 | | `->hourly();` | 每小时运行一次任务 | | `->daily();` | 每天午夜运行任务 | | `->dailyAt('13:00');` | 每天13:00运行任务 | | `->twiceDaily(1, 13);` | 每天在1:00和13:00运行任务 | | `->weekly();` | 每周运行任务 | | `->monthly();` | 每月运行任务 | 这些方法可以与其他约束条件结合使用,以创建甚至只在一周的某些天运行的更精细的计划。例如,要安排一个命令在星期一每周运行: ~~~ $schedule->call(function () { // 每周一13:00运行一次... })->weekly()->mondays()->at('13:00'); ~~~ 以下是其他计划约束的列表: | 方法 | 描述 | | --- | --- | | `->weekdays();` | 将任务限制为工作日 | | `->sundays();` | 将任务限制为星期日 | | `->mondays();` | 将任务限制为星期一 | | `->tuesdays();` | 将任务限制为星期二 | | `->wednesdays();` | 将任务限制为星期三 | | `->thursdays();` | 将任务限制为星期四 | | `->fridays();` | 将任务限制为星期五 | | `->saturdays();` | 将任务限制为星期六 | | `->when(Closure);` | 根据真相测试限制任务 | #### 真相测试约束 * 该`when`方法可以用于基于给定真值测试的结果来限制任务的执行。 * 如果条件为真 则执行 ~~~ $schedule->command('emails:send')->daily()->when(function () { return true; }); ~~~ ### [](https://octobercms.com/docs/plugin/scheduling#preventing-task-overlaps)防止任务重叠 默认情况下,即使任务的先前实例仍在运行,计划的任务也将运行。为防止这种情况,可以使用以下`withoutOverlapping`方法: ~~~ $schedule->command('emails:send')->withoutOverlapping(); ~~~ 在此示例中,如果`emails:send`[控制台命令](https://octobercms.com/docs/console/commands)尚未运行,则将每分钟运行一次。`withoutOverlapping`如果您的任务在执行时间上有很大不同,从而使您不必准确预测给定任务将花费多长时间,则该方法特别有用。 ### [](https://octobercms.com/docs/plugin/scheduling#task-output)任务输出 计划程序提供了几种方便的方法来处理计划任务生成的输出。首先,使用该`sendOutputTo`方法,您可以将输出发送到文件中以供以后检查: ~~~ $schedule->command('emails:send') ->daily() ->sendOutputTo($filePath); ~~~ 使用该`emailOutputTo`方法,您可以将输出通过电子邮件发送到您选择的电子邮件地址。请注意,必须首先使用`sendOutputTo`方法将输出发送到文件。同样,在通过电子邮件发送任务输出之前,您应该配置[邮件服务](https://octobercms.com/docs/services/mail): ~~~ $schedule->command('foo') ->daily() ->sendOutputTo($filePath) ->emailOutputTo('foo@example.com'); ~~~ > **注:**该`emailOutputTo`和`sendOutputTo`方法是独家的`command`方法,并且不支持`call`。 ### [](https://octobercms.com/docs/plugin/scheduling#task-hooks)任务挂钩 使用`before`和`after`方法,您可以指定计划任务完成之前和之后要执行的代码: ~~~ $schedule->command('emails:send') ->daily() ->before(function () { // Task is about to start... }) ->after(function () { // Task is complete... }); ~~~ #### ping URL 使用`pingBefore`和`thenPing`方法,计划程序可以在任务完成之前或之后自动ping给定URL。此方法对于通知外部服务您计划的任务即将开始或完成很有用: ~~~ $schedule->command('emails:send') ->daily() ->pingBefore($url) ->thenPing($url); ~~~ > 您需要先安装[驱动程序插件,](http://octobercms.com/plugin/october-drivers)然后才能使用`pingBefore($url)`或`thenPing($url)`功能。