タスクのスケジュール設定
- #スケジュールを定義する
- #アーティザン コマンド スケジューリング シェル コマンド スケジューリング
- スケジュール頻度の設定
- 時間範囲の制限
- クロージャ テストの制限
- 環境制約
- ##メンテナンス モード
- ##タスクの出力
- タスクフック
- Ping URL
- ##
タスク スケジューリング
- 概要
- 定義スケジューリング
- アーティザン コマンド スケジューリング
- #キュータスクのスケジューリング
- シェルコマンドのスケジューリング
- スケジューリング頻度の設定
- タイムゾーン
- タスクの重複を避ける #タスクは 1 つのサーバーでのみ実行されます
- バックグラウンド タスク
- メンテナンス モード
タスクの出力 - タスク フック
はじめにこれまでは、新しいタスク フックを作成する必要がある場合がありました。サーバー上の各タスクのスレッド Cron エントリを作成するタスクをスケジュールします。しかし、これらのタスク スケジューラがソース コードに含まれておらず、Cron エントリを追加するには毎回 SSH リンクを介してサーバーにログインする必要があるため、このアプローチはすぐに不親切になります。
Laravel コマンドラインスケジューラーを使用すると、Laravel でコマンドのスケジュールを明確かつスムーズに定義できます。このタスク スケジューラを使用する場合、サーバー上に Cron エントリ インターフェイスを 1 つ作成するだけで済みます。タスクのスケジュールは、
app/Console/Kernel.phpの
schedule
メソッドで定義されます。開始しやすくするために、このメソッドの簡単な例を次に示します。スケジューラの開始このスケジューラを使用する場合、次の Cron エントリをサーバーに追加するだけです。 Cron エントリをサーバーに追加する方法がわからない場合は、
Laravel Forge:
schedule:run* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
この Cron はコマンドです。 Laravelを1分ごとに実行するスケジューラ行。コマンドが実行されると、Laravel はスケジュールに従ってスケジュールされたプログラムを実行します。
スケジュールの定義これは、
App\Console\Kernelクラスで実行できます。 #schedule
は、メソッド内のすべてのスケジュール タスクを定義します。始める前に、例を見てみましょう。この例では、毎日深夜にクロージャを呼び出すことを計画しています。クロージャでは、データベース クエリを実行してテーブルをクリアします。
<?php namespace App\Console; use Illuminate\Support\Facades\DB; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; class Kernel extends ConsoleKernel{ /** * 应用里的自定义 Artisan 命令 * * @var array */ protected $commands = [ // ]; /** * 定义计划任务 * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->call(function () { DB::table('recent_users')->delete(); })->daily(); } }
クロージャを使用してタスクのスケジュールを定義することに加えて、
呼び出し可能オブジェクトを使用することもできます。$schedule->call(new DeleteRecentUsers)->daily();
アーティザン コマンドのスケジューリング
クロージャの呼び出しによるスケジューリングに加えて、アーティザン コマンドやオペレーティング システム コマンドを呼び出すこともできます。たとえば、コマンド名またはクラスを
command
メソッドに渡すことで、アーティザン コマンドをスケジュールできます。$schedule->command('emails:send --force')->daily(); $schedule->command(EmailsCommand::class, ['--force'])->daily();
キュー タスクのスケジュール
job
メソッドを使用して、キュー タスクをスケジュールできます。このメソッドは、call
メソッドを使用してタスクをスケジュールするクロージャを作成することなく、タスクをスケジュールする簡単な方法を提供します。$schedule->job(new Heartbeat)->everyFiveMinutes(); // 分发任务到「heartbeats」队列... $schedule->job(new Heartbeat, 'heartbeats')->everyFiveMinutes();
シェル コマンド スケジューリング
exec
メソッドを使用して、次のコマンドを送信できます。オペレーティング システム:$schedule->exec('node /home/forge/script.js')->daily();
スケジュール頻度の設定
もちろん、タスクに複数のスケジュール計画を割り当てることができます:
#メソッド 説明 ##->cron('* * * * *'); カスタマイズされた Cron スケジュール実行タスク
->everyMinute(); ->everyFiveMinutes();Perform 1 分ごとにタスクを実行
->everyTenMinutes();5 分ごとにタスクを実行
->everyFifteenMinutes();10 分ごとにタスクを実行します
->everyThirtyMinutes();15 分ごとにタスクを実行する
->hourly();30 分ごとにタスクを実行するminutes
->hourlyAt(17);タスクを 1 時間ごとに実行します
-> ;daily();毎時 17 分にタスクを実行します
->dailyAt('13:00' );毎日午前 0 時にタスクを実行する (翻訳者注: 毎日午前 0 時に)
タスクを毎日 13:00 に 1 回実行します
##->twiceDaily(1, 13); 毎日 1 回、1:00 と 13:00 にタスクを実行します ->weekly(); タスクを実行します週に 1 回 ##->weeklyOn(1, '8:00'); 毎週月曜日の 8 時にタスクを実行します # ->monthly();
タスクを月に 1 回実行します ->monthlyOn ( 4, '15:00');
毎月 4 日の 15:00 にタスクを実行します ->四半期ごと();
四半期ごとにタスクを実行します ->年ごと();
実行します年に 1 回のタスク ###->timezone('America/New_York'); タイムゾーンを設定他の特定の条件と組み合わせると、週の特定の時間に実行されるタスクを生成できます。たとえば、毎週月曜日にコマンドを実行します:
// 每周一 13:00 执行... $schedule->call(function () { // })->weekly()->mondays()->at('13:00'); // 工作日(周一至周五) 8点 至 17 点每小时执行一次... $schedule->command('foo') ->weekdays() ->hourly() ->timezone('America/Chicago') ->between('8:00', '17:00');
追加の制限リストは次のとおりです:
メソッド 説明 #->weekdays(); 業務日に実行するタスクを制限する->weekends(); タスクの実行を週末に制限する->日曜日( ); 日曜日に実行されるタスクを制限する->月曜日(); 制限する月曜日に実行されるタスク##->tuesdays(); #火曜日に実行されるタスクを制限する
## ->wednesdays(); タスクの実行を水曜日に制限する ->木曜日(); 木曜日に実行されるタスクを制限する ##->金曜日(); 制限する金曜日に実行されるタスク ->saturdays(); 土曜日に実行されるタスクを制限する ##-> between($start, $end);$start と $end# の間で実行されるタスクを制限します
クロージャーが true を返したときに実行されます##->when(Closure);
#->環境 ($env);
特定の環境で実行されるタスクを制限します 時間範囲制限
タスクの実行を 1 日の特定の時間帯に制限するには、
between
を使用します:$schedule->command('reminders:send') ->hourly() ->between('7:00', '22:00');
または # を使用します。 ##unlessBetween
タスクの期間を除外するメソッド:
$schedule->command('reminders:send') ->hourly() ->unlessBetween('23:00', '4:00');
クロージャ テスト制限when
メソッドを使用して、ベースにします。テスト結果に基づいてタスクを実行します。つまり、指定されたクロージャが
trueを返した場合、タスクの実行を妨げる他の制約がない限り、タスクは実行を続けます:
$schedule->command('emails:send')->daily()->when(function () { return true; });
skip
メソッドは、
whenメソッドの逆のプロセスとみなすことができます。
skipメソッドが
trueを返した場合、タスクは実行されません:
$schedule->command('emails:send')->daily()->skip(function () { return true; });
連鎖呼び出しwhen
環境制約メソッドを使用する場合、すべて
が
trueを返した場合、タスクは実行されます。
environments
メソッドは、特定の環境でのみタスクを実行するために使用できます:
$schedule->command('emails:send') ->daily() ->environments(['staging', 'production']);
タイム ゾーンtimezone
app/Console/Kernel.phpメソッドを使用すると、タスクが特定のタイム ゾーンで実行されるように指定できます。
すべてのスケジュールされたタスクに同じタイム ゾーンを割り当てる場合は、$schedule->command('report:generate') ->timezone('America/New_York') ->at('02:00')
ファイルで
{note} 一部のタイム ゾーンでは夏時間が使用されていることに注意してください。夏時間が変更されると、タスクが 2 回実行されるか、まったく実行されない場合があります。したがって、スケジュールされたタスクのスケジュールにはタイム ゾーンを使用しないことを可能な限り避けることをお勧めします。scheduleTimezone
メソッドを定義できます。このメソッドは、スケジュールされたすべてのタスクに割り当てる必要があるデフォルトのタイム ゾーンを返す必要があります:/** * 获取默认情况下应为预定事件使用的时区。 * * @return \DateTimeZone|string|null */ protected function scheduleTimezone(){ return 'America/Chicago'; }
#タスクの重複を避けるデフォルトでは、前のタスクがまだ実行中であっても、スケジュールはwill タスクも実行されます。
withoutOverlapping
メソッドを使用すると、これを回避できます。$schedule->command('emails:send')->withoutOverlapping();
この例では、
emails:send Artisan コマンドが実行されていない場合、コマンドは 1 分ごとに送信されます。一度。タスクの実行時間が不確実で、タスクの実行時間を正確に見積もることができない場合は、withoutOverlapping
メソッドが特に役立ちます。
必要に応じて、指定した時間範囲に対して「重複なし」ロックを指定できます。デフォルトでは、ロックは 24 時間後に期限切れになります。
$schedule->command('emails:send')->withoutOverlapping(10);
タスクは 1 つのサーバーでのみ実行されます
{note} この機能を使用するには、アプリケーションのデフォルトのキャッシュ ドライバーが
memcached
またはredis
である必要があります。さらに、すべてのサーバーは同じ中央キャッシュ サーバーを使用して通信する必要があります。アプリケーションが複数のサーバーで実行される場合は、スケジュールされたタスクを 1 つのサーバーでのみ実行するように制限する必要がある場合があります。毎週金曜日の夜に新しいレポートを生成するスケジュールがあるとします。タスク スケジューラが 3 台のサーバーで実行される場合、タスクは 3 台のサーバーで実行され、3 つのレポートが生成されます。これは良くない!
タスクを単一サーバーで実行する必要があることを示すには、スケジュールされたタスクを定義するときに
onOneServer
メソッドを使用します。タスクを取得した最初のサーバーは、他のサーバーが同じタスクを同時に実行できないようにアトミック ロックを生成します。$schedule->command('report:generate') ->fridays() ->at('17:00') ->onOneServer();
バックグラウンド タスク
デフォルトでは、同時にスケジュールされた複数のコマンドは順番に実行されます。実行時間の長いコマンドがある場合、後続のコマンドの開始が予想より遅くなる可能性があります。したがって、バックグラウンドでコマンドを同時に実行したい場合は、
runInBackground
メソッドを使用できます。$schedule->command('analytics:report') ->daily() ->runInBackground();
メンテナンスモード
Laravelのキュータスクはメンテナンスモードでは実行されません。スケジュール設定タスクが、サーバー上で完了しない可能性のあるプロジェクトに干渉することを望まないからです。ただし、スケジュールされたタスクをメンテナンス モードで強制的に実行したい場合は、
evenInMaintenanceMode
メソッドを使用できます:$schedule->command('emails:send')->evenInMaintenanceMode();
タスク出力
Laravel スケジューラーは、スケジュールされたタスク出力を処理するための便利なメソッドをいくつか提供します。まず、
sendOutputTo
メソッドを使用して、後で検査できるようにファイルに出力します。$schedule->command('emails:send') ->daily() ->sendOutputTo($filePath);
出力
を特定のファイルに追加したい場合は、次のようにすることができます。
appendOutputTo
メソッドを使用します。$schedule->command('emails:send') ->daily() ->appendOutputTo($filePath);
emailOutputTo
メソッドを使用すると、指定したメールボックスに出力を送信できます。電子メールを使用して送信する前に、Laravel の電子メール サービスを設定する必要があります:$schedule->command('foo') ->daily() ->sendOutputTo($filePath) ->emailOutputTo('foo@example.com');
タスクフック{note}
emailOutputTo
、sendOutputTo
、およびappendOutputTo
メソッドはcommand
とexec
に固有です。before
と
after## を使用します #メソッドでは、スケジュールされたタスクの実行前または後に特定のコードを実行できます:$schedule->command('emails:send') ->daily() ->before(function () { // Task is about to start... }) ->after(function () { // Task is complete... });
Ping URL
pingBefore
メソッドとthenPing
メソッドを使用すると、タスクの実行前または後に指定された URL に ping を実行できます。このメソッドは、外部サービス (Laravel Envoyer など) に通知する場合に特に役立ちます。$schedule->command('emails:send') ->daily() ->pingBefore($url) ->thenPing($url);
指定された条件が
true
の場合にのみ使用できます。 pingBeforeIf
およびthenPingIf
メソッドは、指定された URL に ping を送信します。$schedule->command('emails:send') ->daily() ->pingBeforeIf($condition, $url) ->thenPingIf($condition, $url);
すべての ping メソッドには、Guzzle HTTP ライブラリが必要です。 Composer を使用して、Guzzle をプロジェクトに追加できます。
composer require guzzlehttp/guzzle
この記事は、LearnKu.com Web サイトで最初に公開されました。← 列