补充缺失部分
修改理由:
相关信息:
- 类型:文档文章
- 文章: 任务调度
- 文档: 《Laravel 10 中文文档(10.x)》
此投稿状态为 标记为已读。
标题修改:
内容修改:
| Old | New | Differences |
|---|---|---|
| 1 | ||
| 2 | 1 | # 任务调度 |
| 3 | 2 | |
| 4 | 3 | - [简介](#introduction) | … | … |
| 51 | 50 | } |
| 52 | 51 | } |
| 53 | 52 | |
| 54 | ||
| 55 | ||
| 53 | ||
| 54 | ||
| 56 | 55 | 除了调用闭包这种方式来调度外,你还可以调用 [可调用对象](https://secure.php.net/manual/en/language.oop5.magic.php#object.invoke)。 可调用对象是简单的 PHP 类,包含一个 `__invoke` 方法: |
| 57 | 56 | |
| 58 | 57 | $schedule->call(new DeleteRecentUsers)->daily(); | … | … |
| 92 | 91 | // 分发任务到「heartbeats」队列及「sqs」连接... |
| 93 | 92 | $schedule->job(new Heartbeat, 'heartbeats', 'sqs')->everyFiveMinutes(); |
| 94 | 93 | |
| 95 | ||
| 96 | ||
| 94 | <a name="scheduling-shell-commands"></a> | |
| 95 | ### Shell 调度命令 | |
| 96 | ||
| 97 | `exec` 方法可以用来向操作系统发出命令: | |
| 98 | ||
| 99 | $schedule->exec('node /home/forge/script.js')->daily(); | |
| 100 | ||
| 101 | <a name="schedule-frequency-options"></a> | |
| 102 | ### 调度频率选项 | |
| 103 | ||
| 104 | 我们已经看到了几个例子,说明你如何配置一个任务以指定的时间间隔运行。然而,还有许多任务调度频率可以分配给任务: | |
| 105 | ||
| 106 | <div class="overflow-auto"> | |
| 107 | ||
| 108 | 方法 | 描述 | |
| 109 | ------------- | ------------- | |
| 110 | `->cron('* * * * *');` | 自定义 Cron 计划执行任务 | |
| 111 | `->everyMinute();` | 每分钟执行一次任务 | |
| 112 | `->everyTwoMinutes();` | 每两分钟执行一次任务 | |
| 113 | `->everyThreeMinutes();` | 每三分钟执行一次任务 | |
| 114 | `->everyFourMinutes();` | 每四分钟执行一次任务 | |
| 115 | `->everyFiveMinutes();` | 每五分钟执行一次任务 | |
| 116 | `->everyTenMinutes();` | 每十分钟执行一次任务 | |
| 117 | `->everyFifteenMinutes();` | 每十五分钟执行一次任务 | |
| 118 | `->everyThirtyMinutes();` | 每三十分钟执行一次任务 | |
| 119 | `->hourly();` | 每小时执行一次任务 | |
| 120 | `->hourlyAt(17);` | 每小时第十七分钟时执行一次任务 | |
| 121 | `->everyOddHour();` | 每隔奇数小时运行一次该任务 | |
| 122 | `->everyTwoHours();` | 每两小时运行一次任务 | |
| 123 | `->everyThreeHours();` | 每三小时运行一次任务 | |
| 124 | `->everyFourHours();` | 每四小时运行一次任务 | |
| 125 | `->everySixHours();` | 每六小时运行一次任务 | |
| 126 | `->daily();` | 每天午夜运行一次任务 | |
| 127 | `->dailyAt('13:00');` | 每天 13:00 运行一次任务 | |
| 128 | `->twiceDaily(1, 13);` | 每天在 1:00 和 13:00 各运行一次任务 | |
| 129 | `->twiceDailyAt(1, 13, 15);` | 每天在 1:15 和 13:15 各运行一次任务 | |
| 130 | `->weekly();` | 每周日 00:00 运行一次任务 | |
| 131 | `->weeklyOn(1, '8:00');` | 每周一 08:00 执行一次任务 | |
| 132 | `->monthly();` | 每月第一天 00:00 执行一次任务 | |
| 133 | `->monthlyOn(4, '15:00');` | 每月第四天 15:00 执行一次任务 | |
| 134 | `->twiceMonthly(1, 16, '13:00');` | 每月第一天和第 十六天的 13:00 各执行一次任务 | |
| 135 | `->lastDayOfMonth('15:00');` | 每月最后一天 15:00 执行一次任务 | |
| 136 | `->quarterly();` | 每季度第一天 00:00 执行一次任务 | |
| 137 | `->quarterlyOn(4, '14:00');` | 每季度第四天 14:00 运行一次任务 | |
| 138 | `->yearly();` | 每年第一天 00:00 运行一次任务 | |
| 139 | `->yearlyOn(6, 1, '17:00');` | 每年 6 月 1 日 17:00 运行一次任务 | |
| 140 | `->timezone('America/New_York');` | 设置任务的时区 | |
| 141 | ||
| 142 | </div> | |
| 143 | ||
| 97 | 144 | 这些方法与额外的约束条件相结合后,可用于创建在一周的特定时间运行甚至更精细的计划任务。例如,在每周一执行命令: |
| 98 | 145 | |
| 99 | 146 | // 在每周一 13:00 执行... | … | … |
| 108 | 155 | ->timezone('America/Chicago') |
| 109 | 156 | ->between('8:00', '17:00'); |
| 110 | 157 | |
| 111 | ||
| 158 | 以下是其他调度限制条件清单: | |
| 112 | 159 | |
| 113 | 160 | <div class="overflow-auto"> |
| 114 | 161 | … | … |
| 140 | 187 | ->hourly() |
| 141 | 188 | ->days([0, 3]); |
| 142 | 189 | |
| 143 | ||
| 144 | ||
| 190 | ||
| 191 | ||
| 145 | 192 | 不仅如此,你还可以使用 `Illuminate\Console\Scheduling\Schedule` 类中的常量来设置任务在指定日期运行: |
| 146 | 193 | |
| 147 | 194 | use Illuminate\Console\Scheduling\Schedule; | … | … |
| 191 | 238 | ->daily() |
| 192 | 239 | ->environments(['staging', 'production']); |
| 193 | 240 | |
| 194 | ||
| 195 | ||
| 241 | ||
| 242 | ||
| 196 | 243 | <a name="timezones"></a> |
| 197 | 244 | ### 时区 |
| 198 | 245 | … | … |
| 214 | 261 | return 'America/Chicago'; |
| 215 | 262 | } |
| 216 | 263 | |
| 217 | > **注意** | |
| 264 | > **注意** | |
| 218 | 265 | > 请记住,有些时区会使用夏令时。当夏令时发生调整时,你的任务可能会执行两次,甚至根本不会执行。因此,我们建议尽可能避免使用时区来安排计划任务。 |
| 219 | 266 | |
| 220 | 267 | <a name="preventing-task-overlaps"></a> | … | … |
| 230 | 277 | |
| 231 | 278 | $schedule->command('emails:send')->withoutOverlapping(10); |
| 232 | 279 | |
| 233 | ||
| 234 | ||
| 280 | ||
| 281 | ||
| 235 | 282 | 上面这种场景中,`withoutOverlapping` 方法使用应用程序的 [缓存](/docs/laravel/10.x/cachemd) 获取锁。如有必要,可以使用`schedule:clear cache` Artisan命令清除这些缓存锁。这通常只有在任务由于意外的服务器问题而卡住时才需要。 |
| 236 | 283 | |
| 237 | 284 | <a name="running-tasks-on-one-server"></a> |
| 238 | 285 | ### 任务只运行在一台服务器上 |
| 239 | 286 | |
| 240 | > **注意** | |
| 287 | > **注意** | |
| 241 | 288 | > 要使用此功能,你的应用程序必须使用 `database`, `memcached`, `dynamodb`, 或 `redis` 缓存驱动程序作为应用程序的默认缓存驱动程序。此外,所有服务器必须和同一个中央缓存服务器通信。 |
| 242 | 289 | |
| 243 | 290 | 如果你的应用运行在多台服务器上,可能需要限制调度任务只在某台服务器上运行。 例如,假设你有一个每个星期五晚上生成新报告的调度任务,如果任务调度器运行在三台服务器上,调度任务会在三台服务器上运行并且生成三次报告,不够优雅! | … | … |
| 266 | 313 | ->onOneServer(); |
| 267 | 314 | ``` |
| 268 | 315 | |
| 269 | ||
| 270 | ||
| 316 | ||
| 317 | ||
| 271 | 318 | 如果你使用闭包来定义单服务器作业,则必须为他们定义一个名字 |
| 272 | 319 | |
| 273 | 320 | ```php | … | … |
| 308 | 355 | * * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1 |
| 309 | 356 | ``` |
| 310 | 357 | |
| 311 | ||
| 312 | ||
| 358 | ||
| 359 | ||
| 313 | 360 | <a name="running-the-scheduler-locally"></a> |
| 314 | 361 | ## 本地运行调度程序 |
| 315 | 362 | … | … |
| 364 | 411 | // 任务已经执行。。。 |
| 365 | 412 | }); |
| 366 | 413 | |
| 367 | ||
| 368 | ||
| 414 | ||
| 415 | ||
| 369 | 416 | 使用 `onSuccess` 和 `onFailure` 方法,你可以决定在调度任务成功或者失败运行代码。失败表示 Artisan 或系统命令以非零退出码终止: |
| 370 | 417 | |
| 371 | 418 | $schedule->command('emails:send') | … | … |
| 414 | 461 | ->pingOnSuccess($successUrl) |
| 415 | 462 | ->pingOnFailure($failureUrl); |
| 416 | 463 | |
| 417 | ||
| 418 | ||
| 464 | ||
| 465 | ||
| 419 | 466 | 所有 ping 方法都依赖 Guzzle HTTP 库。通常,Guzzle 已在所有新的 Laravel 项目中默认安装,不过,若意外将 Guzzle 删除,则可以使用 Composer 包管理器将 Guzzle 手动安装到项目中: |
| 420 | 467 | |
| 421 | 468 | ```shell | … | … |
| 453 | 500 | 'App\Listeners\LogScheduledTaskFailed', |
| 454 | 501 | ], |
| 455 | 502 | ]; |
| 503 | ||
| 456 | 504 | |
| 457 |
关于 LearnKu