高橋 です

Webのデザインとかプログラムとか

Laravel5 コマンド登録とスケジュール機能について

こんにちは〜たきゃはしです〜。

Laravel Advent Calendar 2014 - Qiita

8日目ですよ〜!

Laravel5 のコマンド登録とスケジュールという新機能について紹介したいと思います。 2014/12/08時点でLaravel5は開発中のため今後機能が変更される可能性もございますが予めご了承ください。

Laravel5(開発版)のインストール

$ composer create-project laravel/laravel laravel5 dev-develop --prefer-dist

laravel5 というディレクトリに展開します。

コマンド生成

$ php artisan make:console ClockCommand --command="clock"
Console command created successfully.

php artisan clock で現時刻を出力するコマンドを作りたいと思います。(clockという名前は適当につけてしまいました)

コマンド編集

app/Console/Commands/ClockCommand.php

public function fire()
{
    echo date('Y-m-d H:i:s'); // 追加
}

※ getArguments() メソッドはコマンドの引数を取る必要があったので削除しました。

コマンド登録

app/Console/Kernel.php

protected $commands = [
    'App\Console\Commands\InspireCommand',
    'App\Console\Commands\ClockCommand' // 追加
];

追加し忘れでハマりそうな予感がします。

コマンド実行

$ php artisan clock
2014-12-08 02:31:57%

簡単にコマンドが登録できました。

続いて新機能のスケジュール(schedule:run)について紹介していきます。
まずcronへ下記のような唯一のジョブを登録をします。

唯一のジョブ登録

~/Sites/test/php/laravel5 crontab -e
*/1 * * * * php ~/Sites/test/php/laravel5/artisan schedule:run

次に先程作成したclockコマンドをスケジュールに登録します。

スケジュール登録

app/Console/Kernel.php

protected function schedule(Schedule $schedule)
{
    $schedule->command('inspire')
        ->hourly();

    // 追加
    $schedule->command('clock')
        ->cron('*/5 * * * * *')
        ->sendOutputTo('~/tmp/clock.log');
}

なんと Kernel.phpに schesule(Schedule $schedule) を実装するだけです。

また上記で実行している cron('/5 * * * * ') というのは everyFiveMinutes() で置き換えることもできます。
他にも便利なメソッドがたくさんありますのでドキュメントや Illuminate\Console\Scheduling\Event をご覧ください。

・Scheduling Artisan Commands http://laravel.com/docs/master/artisan#scheduling-artisan-commands

まとめ

スケジュール機能の嬉しいところは、今までcronというスコープ外に置いていた様々なジョブをアプリケーションの一部として管理できることだと思います。またジョブの確認についてもcronだとユーザーごとにバラけていたりしますが、スケジュール機能ならソースを読むだけでジョブを一望できるため便利だなぁと思います。

L5では新機能や改善点、特に構造的に自由度が上がっている点(は一長一短ではあると思います)が楽しみだなぁと思っています。とにかく正式なリリースが待ち遠しいです!!

9日は shin1x1 さんです。よろしくお願いします。

参考