ホームページ >バックエンド開発 >PHPチュートリアル >[ Laravel 5.2 ドキュメント ] サービス -- タスクのスケジューリング

[ Laravel 5.2 ドキュメント ] サービス -- タスクのスケジューリング

WBOY
WBOYオリジナル
2016-06-23 13:17:051095ブラウズ

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 分ごとにタスクを実行します 1 時間ごとにタスクを実行します を実行します毎日午前 0 時にタスクを実行します -> dailyAt('13:00'); ->twiceDaily(1, 13);日の 1:00 と 13:00 -> 毎週 (); タスクを週に 1 回実行します ->monthly(); 四半期ごとに 1 回実行します 1 年に 1 回実行します これらのメソッドを追加の制約と組み合わせて、より詳細な制約を作成できます。たとえば、毎週月曜日にコマンドをスケジュールするには: 追加のスケジュール制約のリストを次に示します: MethodDescription ->weekdays( ); 平日のみタスクを実行します
メソッド ...
->hourly()
->daily();
タスクを毎日 13:00 に実行します
->quarly();
->yearly();
$schedule->call(function () {    // 每周星期一13:00运行一次...})->weekly()->mondays()->at('13:00');
->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 までご連絡ください。