ローカルでLaravelのコマンドスケジューラを使い定時処理(Cron)をする

ローカルでLaravelのコマンドスケジューラを使い定時処理(Cron)をする

331 回閲覧されました

みなさんこんにちは、jonioです。

今回はローカルで定時処理(バッチ処理)をする方法を解説します。

開発環境と使用パソコン

MacでLaravel Sailを使っています。

Laravelのバージョン

8.83.27を使っています。

バッチ処理をするファイルの作成

下記のコマンドを叩きます。

php artisan make:command BatchDemo

「Laravelのプロジェクト > app > Console > Commands」の下の階層にBatchDemo.phpが作成されます。

ファイルのデフォルトの状態は下記です。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

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

    /**
     * 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()
    {
        //
    }
}

変更する行を説明します。

まずは14行目です。

「command:name」はコマンド名です、半角英数字が使えます。

「〜:〜」の形にしないといけません。

「batch:demo」とします。(動作確認で使うので覚えておいて下さい)

次は21行目です。

「Command description」はコマンドの説明です、日本語を使えます。

「バッチ処理のデモ」とします。

次は40行目です。

ここにはバッチ処理で行うことを記述します。

例として下記を記述します。

Log::info('バッチ処理のテストです');

バッチ処理の内容が動作するかの確認をします。

下記のコマンドを叩きます。

php artisan batch:demo

「batch:demo」は14行目で変更した名称です。

バッチ処理で行なっているのはログファイルの出力です。

「Laravelのプロジェクト > storage > logs > laravel.log」に「バッチ処理のテストです」と記載されているはずです。

バッチ処理の登録

「Laravelのプロジェクト > app > Console > Kernel.php」に追記します。

class Kernel extends ConsoleKernel
{
    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('Batch:Demo')->everyMinute();    //この行を追加
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

11行目の「batch:demo」は「バッチ処理をするファイルの作成」の所で覚えておいて下さいと説明した名前です。

「everyMinute()」は1分おきに実行するという意味です。

実行時間はあとで説明する「crontab -e」を叩いたあとに設定するのですがLaravelではKernel.phpで設定できます。

1分おき以外に設定する場合は下記になります。

  • 5分 : everyFiveMinutes();(Fiveを変えれば分を変えることができます)
  • 1時間 : hourly();
  • 毎時23分 : hourlyAt(23);
  • 毎日深夜0時 : daily();
  • 毎日18:45分 : dailyAt(’18:45′);
  • 毎日4時と20時の間 : twiceDaily(4, 20);
  • 毎週 : weekly();
  • 毎月 : monthly();
  • 毎月5日の19:00 : monthlyOn(5, ’19:00′);
  • cronの設定方法 と同じにする: cron(‘* * * * * *’);

コンテナに入る

Dockerのコンテナに入ります。

下記のコマンドを叩いてコンテナ名を調べます。

docker ps

私の場合は「money-count-laravel.test-1」でした。

コンテナに入る為に下記のコマンドを叩きます。

docker exec -it money-count-laravel.test-1 bash

下記みたいな表示になればコンテナに入っています。

root@fab22468ece8:/var/www/html#

cronとvimのインストール

初めて定時処理をする時はcronとvimが入ってないのでインストールします。

下記のコマンドを叩きます。

apt-get update
apt-get install -y cron vim

ジョブの設定

下記のコマンドを叩きます。

crontab -e

ここからvimモードになります、vimモードはターミナル上でファイルを編集できるみたいな物のイメージです。

vimで開いたら下記の内容を入力してジョブの設定をします。

* * * * * cd /var/www/html && php artisan schedule:run >> /var/www/html/storage/logs/laravel.log 2>&1

vimを終了したら下記のコマンドを叩いてください、設定したジョブが表示されたら設定はできています。

crontab -l

そしてジョブの設定ができているかを確認しますが下記が表示されれば動作しています。

* * * * * cd /var/www/html && php artisan schedule:run >> /var/www/html/storage/logs/laravel.log 2>&1

ジョブの動作をスタートさせる

コンテナに入った状態で下記のコマンドを叩きます。

service cron start

コマンドを叩いて下記が表示されたらジョブが一定時間ごとに動作しています。

 * Starting periodic command scheduler cron 

最後にcron処理で表示した内容をログファイルで確認します。

下記のコマンドを叩きます。

cat storage/logs/laravel.log

ログファイルに「バッチ処理のテストです」と表示されたらバッチ処理は正常に動作しています。