Laravel の基本的なチュートリアル - タスクの計画

WBOY
リリース: 2016-06-23 13:01:11
オリジナル
1380 人が閲覧しました

タスクのスケジュール

はじめに

以前は、開発者はスケジュールされたタスクを入力するために手動でスケジュールに行を追加する必要がありました。これらのことを行うにはリモート サーバーに手動でログインする必要があり、コードで効果的に制御できないため、これは非常にイライラします。 Laravel のコマンド スケジューラーを使用すると、Laravel でタスク スケジュールをスムーズに定義できます。これには、サーバーにスケジュールされたタスク エントリを個別に追加するだけで、コードの量でタスク スケジュールを制御できます。

タスクのスケジュールは、app/Console/Kernel.php ファイルのスケジュール メソッドで定義されます。始める前に、簡単な例を見てみましょう。実行したいタスク スケジュールをスケジュール オブジェクトに追加できます。

プランの実行を開始します

サーバーの Cron 項目に次のエントリを追加するだけです:

* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
ログイン後にコピー

Cron は、Laravel のコマンド スケジュールを 1 分ごとに呼び出して、スケジュールされたタスクを実行します。 Laravel はタスクスケジュールを自動的に評価し、期限になったらタスクを実行します。

タスクを定義する

AppConsoleKernel クラスのスケジュール メソッドですべてのタスク プランを定義できます。始める前に、タスク計画の簡単な例を見てみましょう。この例では、毎日午前 0 時にクロージャを実行します。 Closure では、クエリ ステートメントを実行してデータベース テーブルをクリアします。

<?phpnamespace App\Console;use DB;use Illuminate\Console\Scheduling\Schedule;use Illuminate\Foundation\Console\Kernel as ConsoleKernel;class Kernel extends ConsoleKernel{  /**   * The Artisan commands provided by your application.   *   * @var array   */   protected $commands = [     \App\Console\Commands\Inspire::class,   ];   /**    * Define the application's command schedule.    *    * @param \Illuminate\Console\Scheduling\Schedule $schedule    * @return void    */    protected function schedule(Schedule $schedule)    {      $schedule->call(function () {        DB::table('recent_users')->delete();      })->daily();    }}
ログイン後にコピー

Closure 呼び出しのスケジュールに加えて、Artisan コマンドとオペレーティング システム コマンドをスケジュールすることもできます。たとえば、コマンド メソッドを使用してアーティザン コマンドをスケジュールできます:

$schedule->command('emails:send --force')->daily();
ログイン後にコピー

exec メソッドを使用してオペレーティング システムにコマンドを発行できます:

$schedule->exec('node /home/forge/script.js')->daily();
ログイン後にコピー

スケジュール頻度オプション

もちろん、実行できるさまざまなタスクがあります。割り当てられるスケジュール方法:

MethodDescription->cron('* * * * * *');カスタマイズされた Cron タスク プランを実行する->everyMinute () ; 1分ごとにタスクを実行する->everyFiveMinutes();5分ごとにタスクを実行する->everyTenMinutes();10分ごとにタスクを実行する - >hourly();1時間ごとにタスクを実行します->daily();深夜に1回タスクを実行します->dailyAt('13:00');毎日13:00にタスクを実行します->twiceDaily(1, 13);毎日1:00と13:00にタスクを実行します->weekly(); 週に一度タスクを実行します->montyly();月に一度タスクを実行します->monthlyOn(4, '15:00');4日および毎月 15 日: 00 はタスクを実行します & & & gt; 四半期ごと (); /New_York'); タイムゾーンを設定する rrree 追加のスケジュール制約を以下に示します: Description 通常 (土曜日、日曜日を除く) に制限
これらのメソッドを追加の制約と組み合わせて、より細かく調整されたスケジュールを作成できます。特定の曜日のみ実行するなど。毎週月曜日に実行するようにスケジュール コマンドをスケジュールしましょう:
Method
->weekdays();

& & & gt; 日曜日 () ) >金曜日( );

金曜日限定

->土曜日();-> ) ;真実のテストに基づいて制限されています
土曜日限定

真值约束

when 方法可以基于给定的真值测试的结果来约束一个任务的执行。换种说法就是,如果给定的 Closure 返回 true,那么只要其他约束并不阻止任务的执行时,该任务就会被执行:

$schedule->command('emails:send')->daily()->when(function () {  return true;});
ログイン後にコピー

skip 方法刚好与 when 相反。如果 skip 方法返回 true,那么调度任务将不会执行:

$schedule->command('emails:send')->daily()->skip(function () {  return true; });
ログイン後にコピー

当链式调用 when 方法时,只有在所有的 when 约束返回 true 时才会执行调度任务命令。

避免任务重叠

默认的,如果前一个任务还在进程中,计划任务还是会再次运行的。你可以使用 withoutOverlapping 方法来避免这个:

$schedule->command('emails:send')->withoutOverlapping();
ログイン後にコピー

在这个例子中,emails:send Artisan 命令每分钟都会被调度,但是只有在进程中没有运行该命令时才会再次执行。withoutOverlapping 方法对于无法确定执行时间的任务特别有效,这样就可以避免同时执行越来越多的耗时任务增大服务器的压力。

任务输出

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 方法的调用。

任务钩子

你可以使用 before 和 after 方法来在任务计划执行或者完成时执行特定的操作:

$schedule->command('emails:send')         ->daily()         ->before(function () {           // Task is about to start...         })         ->after(function () {           // Task is complete...         });
ログイン後にコピー

Pingings URLs

使用 pingBefore 和 thenPing 方法,任务调度可以自动的在任务完成之前或者之后 ping 给定的 URL。这些方法通常用来通知外部的服务。比如 Laravel Envoyer,告知其计划任务将要执行或者已经完成:

$schedule->command('emails:send')         ->daily()         ->pingBefore($url)         ->thenPing($url);
ログイン後にコピー

使用 pingBefore($url) 或者 thenPing($url) 方法都需要引入 Guzzle HTTP 类库。你可以通过 Composer 来进行安装:

"guzzlehttp/guzzle": "~5.3|~6.0"
ログイン後にコピー

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート