Laravelでコマンド作成とバッチ処理を書く

コマンドクラスの作成

コマンドのクラスを作成します。

php artisan make:command monitorAppStatus

app/Console/Commands/monitorAppStatus.phpが作成されます。
このクラスをartisanで実行するためにはこのクラスファイルの$signatureを書き換えます。

protected $signature = 'command:name';
↓
protected $signature = 'monitor:app';

これでphp artisan monitor:appで実行できるようになります。

コマンドの中身を作成

コマンドの実際の中身の作成は、このクラスファイルのhandle()部分に書きます。

public function handle()
{
    echo "foobar\n";
}

これをコンソール上で実行するとfoobarが表示されます。

php artisan monitor:app
foobar

ここまででコマンドの作成は完了。

スケジュールの追加

Laravelはcronの設定を個別にせずともアプリ内ですべてをまとめて実行します。
app/Console/Kernel.phpを開いてスケジュールを追加します。commandの引数には先程設定したコマンドを書きます。

protected function schedule(Schedule $schedule)
{
    // $schedule->command('inspire')
    //          ->hourly();
    $schedule->command('monitor:app')->hourly();
}

これで1時間に一回実行されるタスクをスケジューリングできました。

cronの設定

Laravelのアプリケーションでは先のapp/Console/Kernel.phpでスケジューリングしたものを一つのcronの設定でまとめて処理してくれるというところが非常に有り難い。例えばroot権限での操作に異常な手続きが必要である場合、一回だけ設定しておけば後はアプリケーション側でスケジューリングできるというスグレモノなのです。

* * * * * php /path/to/project/artisan schedule:run 1>> /dev/null 2>&1

詳しくはcrontabの使い方で設定してください。
phpコマンドはcron実行時にパスが通ってないことがあるのでご注意。パスを通すかフルパスで実行するかになるかと思います。

実行されたことがわかるようにコマンドの内容を書き換えます。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage; ←追加

class monitorAppStatus extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'monitor:app';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
      Storage::disk('local')->put(date("Ymd_His").'.txt', "exec monitor:app\n"); ←追加
    }
}

これでstorage/app/以下に一時間に一回ごとにファイルが作成されます。


[Laravel]タスクスケジュール設定Cronインストールから
Laravelでバッチ処理(Cron)を実行する

Last update: 2018.12.24 (月)