mengguo 1年前

修改理由:

补充缺失部分

相关信息:


此投稿状态为 标记为已读

标题修改:

+ 任务调度

内容修改:

红色背景 为原始内容

绿色背景 为新增或者修改的内容

OldNewDifferences
1  
21# 任务调度
32
43- [简介](#introduction)
 
5150       }
5251   }
5352
54 
55 
 53
 54
5655除了调用闭包这种方式来调度外,你还可以调用 [可调用对象](https://secure.php.net/manual/en/language.oop5.magic.php#object.invoke)。 可调用对象是简单的 PHP 类,包含一个 `__invoke` 方法:
5756
5857   $schedule->call(new DeleteRecentUsers)->daily();
 
9291   // 分发任务到「heartbeats」队列及「sqs」连接...
9392   $schedule->job(new Heartbeat, 'heartbeats', 'sqs')->everyFiveMinutes();
9493
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
97144这些方法与额外的约束条件相结合后,可用于创建在一周的特定时间运行甚至更精细的计划任务。例如,在每周一执行命令:
98145
99146   // 在每周一 13:00 执行...
 
108155             ->timezone('America/Chicago')
109156             ->between('8:00', '17:00');
110157
111 下方列出了额外的约束条件
 158以下是其他调度限制条件清单
112159
113160<div class="overflow-auto">
114161
 
140187                   ->hourly()
141188                   ->days([0, 3]);
142189
143 
144 
 190
 191
145192不仅如此,你还可以使用 `Illuminate\Console\Scheduling\Schedule` 类中的常量来设置任务在指定日期运行:
146193
147194   use Illuminate\Console\Scheduling\Schedule;
 
191238               ->daily()
192239               ->environments(['staging', 'production']);
193240
194 
195 
 241
 242
196243<a name="timezones"></a>
197244### 时区
198245
 
214261       return 'America/Chicago';
215262   }
216263
217 > **注意** 
 264> **注意**
218265> 请记住,有些时区会使用夏令时。当夏令时发生调整时,你的任务可能会执行两次,甚至根本不会执行。因此,我们建议尽可能避免使用时区来安排计划任务。
219266
220267<a name="preventing-task-overlaps"></a>
 
230277
231278   $schedule->command('emails:send')->withoutOverlapping(10);
232279
233 
234 
 280
 281
235282上面这种场景中,`withoutOverlapping` 方法使用应用程序的 [缓存](/docs/laravel/10.x/cachemd) 获取锁。如有必要,可以使用`schedule:clear cache` Artisan命令清除这些缓存锁。这通常只有在任务由于意外的服务器问题而卡住时才需要。
236283
237284<a name="running-tasks-on-one-server"></a>
238285### 任务只运行在一台服务器上
239286
240 > **注意** 
 287> **注意**
241288> 要使用此功能,你的应用程序必须使用 `database`, `memcached`, `dynamodb`, 或 `redis` 缓存驱动程序作为应用程序的默认缓存驱动程序。此外,所有服务器必须和同一个中央缓存服务器通信。
242289
243290如果你的应用运行在多台服务器上,可能需要限制调度任务只在某台服务器上运行。 例如,假设你有一个每个星期五晚上生成新报告的调度任务,如果任务调度器运行在三台服务器上,调度任务会在三台服务器上运行并且生成三次报告,不够优雅!
 
266313           ->onOneServer();
267314```
268315
269 
270 
 316
 317
271318如果你使用闭包来定义单服务器作业,则必须为他们定义一个名字
272319
273320```php
 
308355* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
309356```
310357
311 
312 
 358
 359
313360<a name="running-the-scheduler-locally"></a>
314361## 本地运行调度程序
315362
 
364411                // 任务已经执行。。。
365412            });
366413
367 
368 
 414
 415
369416使用 `onSuccess` 和 `onFailure` 方法,你可以决定在调度任务成功或者失败运行代码。失败表示 Artisan 或系统命令以非零退出码终止:
370417
371418   $schedule->command('emails:send')
 
414461            ->pingOnSuccess($successUrl)
415462            ->pingOnFailure($failureUrl);
416463
417 
418 
 464
 465
419466所有 ping 方法都依赖 Guzzle HTTP 库。通常,Guzzle 已在所有新的 Laravel 项目中默认安装,不过,若意外将 Guzzle 删除,则可以使用 Composer 包管理器将 Guzzle 手动安装到项目中:
420467
421468```shell
 
453500           'App\Listeners\LogScheduledTaskFailed',
454501       ],
455502   ];
 503  
456504
457