1. はじめに
以前は、開発者はスケジュールする必要があるタスクごとに Cron エントリを作成する必要があり、これは頭痛の種でした。タスク スケジューラはソース管理にないため、SSH を使用してサーバーにログインし、これらの cron エントリを追加する必要があります。 Laravel コマンド スケジューラを使用すると、Laravel でコマンド スケジュールをスムーズかつ表現力豊かに定義でき、サーバー上に必要な Cron エントリは 1 つだけです。
タスクのスケジュールは、app/Console/Kernel.php ファイルのスケジュール メソッドで定義されており、このメソッドにはサンプルが既に含まれています。必要なスケジュール済みタスクをスケジュール オブジェクトに自由に追加できます。
スケジュールを有効にする
サーバーに追加する必要がある Cron エントリは次のとおりです:
* * * * * php /path/to/artisan schedule:run 1>> /dev/null 2>&1
ログイン後にコピー
この Cron は、Laravel コマンド スケジューラを毎分呼び出します。その後、Laravel はスケジュールされたタスクを評価し、期限が切れたタスクを実行します。
2. スケジュールを定義する
スケジュールされたすべてのタスクを AppConsoleKernel クラスのスケジュール メソッドで定義できます。始める前に、タスクのスケジュール設定の例を見てみましょう。この例では、毎日深夜に呼び出されるクロージャをスケジュールします。このクロージャでは、データベース クエリを実行してテーブルをクリアします。
<?phpnamespace App\Console;use DB;use Illuminate\Console\Scheduling\Schedule;use Illuminate\Foundation\Console\Kernel as ConsoleKernel;class Kernel extends ConsoleKernel{ /** * 应用提供的Artisan命令 * * @var array */ protected $commands = [ 'App\Console\Commands\Inspire', ]; /** * 定义应用的命令调度 * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->call(function () { DB::table('recent_users')->delete(); })->daily(); }}
ログイン後にコピー
クロージャ呼び出しのスケジュールに加えて、アーティザン コマンドとオペレーティング システム コマンドもスケジュールできます。たとえば、コマンド メソッドを使用して Artisan コマンドをスケジュールできます:
$schedule->command('emails:send --force')->daily();
ログイン後にコピー
exec コマンドを使用して、オペレーティング システムにコマンドを送信できます:
$schedule->exec('node /home/forge/script.js')->daily();
ログイン後にコピー
2.1 共通のスケジュール オプション
もちろん、複数のスケジュールを割り当てることもできます。タスク:
メソッド ... | | ->everyFiveMinutes();
5 分ごとにタスクを実行する | | ->everyTenMinutes();
10 分ごとにタスクを実行する | | ->everyThirtyMinute s();
30 分ごとにタスクを実行します | ->hourly() | 1 時間ごとにタスクを実行します
->daily(); | を実行します毎日午前 0 時にタスクを実行します |
-> dailyAt('13:00'); タスクを毎日 13:00 に実行します | | ->twiceDaily(1, 13);日の 1:00 と 13:00
| -> 毎週 (); | タスクを週に 1 回実行します
| ->monthly(); ->quarly(); |
四半期ごとに 1 回実行します | ->yearly(); | 1 年に 1 回実行します
| これらのメソッドを追加の制約と組み合わせて、より詳細な制約を作成できます。たとえば、毎週月曜日にコマンドをスケジュールするには: $schedule->call(function () { // 每周星期一13:00运行一次...})->weekly()->mondays()->at('13:00'); ログイン後にコピー | 追加のスケジュール制約のリストを次に示します:
| Method | Description
| ->weekdays( ); | 平日のみタスクを実行します
->sundays(); | 毎週タスクを実行します |
& gt;saturdays() ); | 毎週土曜日にタスクを実行する |
->when(Closure)
特定のテストに基づいてタスクを実行する
基于测试的约束条件
when方法用于限制任务在通过给定测试之后运行。换句话说,如果给定闭包返回 true,只要没有其它约束条件阻止任务运行,该任务就会执行:
$schedule->command('emails:send')->daily()->when(function () { return true;});
ログイン後にコピー
reject方法和when相反,如果reject方法返回true,调度任务将不会执行:
$schedule->command('emails:send')->daily()->reject(function () { return true;});
ログイン後にコピー
使用when方法链的时候,调度命令将只会执行返回true的when方法。
2.2 避免任务重叠
默认情况下,即使前一个任务仍然在运行调度任务也会运行,要避免这样的情况,可使用 withoutOverlapping方法:
$schedule->command('emails:send')->withoutOverlapping();
ログイン後にコピー
在本例中,Artisan命令 emails:send每分钟都会运行,如果该命令没有在运行的话。如果你的任务在执行时经常大幅度的变化,那么 withoutOverlapping方法就非常有用,你不必再去预测给定任务到底要消耗多长时间。
3、任务输出
Laravel调度器为处理调度任务输出提供了多个方便的方法。首先,使用 sendOutputTo方法,你可以发送输出到文件以便稍后检查:
$schedule->command('emails:send') ->daily() ->sendOutputTo($filePath);
ログイン後にコピー
如果你想要追加输出到给定文件,可以使用appendOutputTo方法:
$schedule->command('emails:send') ->daily() ->appendOutputTo($filePath);
ログイン後にコピー
使用 emailOutputTo方法,你可以将输出发送到电子邮件,注意输出必须首先通过 sendOutputTo方法发送到文件。还有,使用电子邮件发送任务输出之前,应该配置Laravel的电子邮件服务:
$schedule->command('foo') ->daily() ->sendOutputTo($filePath) ->emailOutputTo('foo@example.com');
ログイン後にコピー
注意: emailOutputTo和 sendOutputTo方法只对 command方法有效,不支持 call方法。
4、任务钩子
使用 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。该方法在通知外部服务时很有用,例如 Laravel Envoyer,在调度任务开始或完成的时候:
$schedule->command('emails:send') ->daily() ->pingBefore($url) ->thenPing($url);
ログイン後にコピー
使用 pingBefore($url)或 thenPing($url)特性需要安装HTTP库Guzzle,可以在 composer.json文件中添加如下行来安装Guzzle到项目:
"guzzlehttp/guzzle": "~5.3|~6.0"
ログイン後にコピー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
-
2024-10-22 09:46:29
-
2024-10-13 13:53:41
-
2024-10-12 12:15:51
-
2024-10-11 22:47:31
-
2024-10-11 19:36:51
-
2024-10-11 15:50:41
-
2024-10-11 15:07:41
-
2024-10-11 14:21:21
-
2024-10-11 12:59:11
-
2024-10-11 12:17:31