补充缺失部分

修改理由:
相关信息:
- 类型:文档文章
- 文章: 任务调度
- 文档: 《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 |