[PHP][Laravel][Cron][Xserver]Laravelでcronで実行できるバッチを作った話>スケジューラー編

2020年10月13日

この記事の続きです。

スケジューラー登録

この記事で作成したJob(コマンド)をCron経由で定期的に実行する方法をご説明します。

Cronでスケジューラーの設定ファイルを毎分読みにいくようにして実行対象のJob(コマンド)があれば実行していくイメージです。

直接Job(コマンド)をCronに登録するより管理はしやすいと思います。

app/Console/Kernel.phpを開く
このschedule関数にコマンドを登録していく感じです。←スケジューラーへJob(コマンド)の登録

まずは前の記事で作ったコマンドをおさらい
今の現在日時を出力するコマンドを作成しました。

php artisan command:test
>2020-10-13 02:01:33

よし現在日時が出力されたOK!!ってことでスケジューラーの登録へ
command:testのコマンドが1時間ごとに動くように登録しました。

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

タスクにはさまざまなスケジュールを割り付けることができます。
これだけ登録できれば事足りるでしょう!

メソッド説明
->cron('* * * * *'); Cron指定に基づきタスク実行
->everyMinute();毎分タスク実行
->everyTwoMinutes();2分毎にタスク実行
->everyThreeMinutes();3分毎にタスク実行
->everyFourMinutes();4分毎にタスク実行
->everyFiveMinutes();5分毎にタスク実行
->everyTenMinutes();10分毎にタスク実行
->everyFifteenMinutes();15分毎にタスク実行
->everyThirtyMinutes();30分毎にタスク実行
->hourly();毎時タスク実行
->hourlyAt(17);1時間ごと、毎時17分にタスク実行
->everyTwoHours();2時間毎にタスク実行
->everyThreeHours();3時間毎にタスク実行
->everyFourHours();4時間毎にタスク実行
->everySixHours();6時間毎にタスク実行
->daily();毎日深夜12時に実行
->dailyAt('13:00');毎日13:00に実行
->twiceDaily(1, 13);毎日1:00と13:00時に実行
->weekly();毎週日曜日の00:00にタスク実行
->weeklyOn(1, '8:00');毎週月曜日の8:00時に実行
->monthly();毎月1日の00:00にタスク実行
->monthlyOn(4, '15:00');毎月4日の15:00に実行
->twiceMonthly(1, 16, '13:00');毎月1日と16日の13:00にタスク実行
->lastDayOfMonth('15:00');毎月最終日の15:00時に実行
->quarterly();四半期の初日の00:00にタスク実行
->yearly();毎年1月1日の00:00にタスク実行
->yearlyOn(7, 7, '17:00');毎年7月7日の17:00にタスク実行
->timezone('America/New_York');タイムゾーン設定
引用 https://readouble.com/laravel/8.x/ja/scheduling.html

ローカルでテスト実行

Cronに登録する前にローカルで確認する方法があります。
一手間?かかリますが問題切り分け等のためにこのステップを踏んでおくことをお勧めします。

このコマンドでOKです。

php artisan schedule:work

バックグラウンド実行でCronと同じく1分ごとにスケジューラーを実行します。
こんな感じで実行ログが追えます。

xxxxxx@xxxxxx command % php artisan schedule:work
Schedule worker started successfully.
Running scheduled command: '/usr/bin/php' 'artisan' command:test > '/dev/null' 2>&1
Running scheduled command: '/usr/bin/php' 'artisan' command:test > '/dev/null' 2>&1

これだけだと本当に実行されているかわからないって方は、
Logクラスを読み込んでLogを吐いてみるといいと思います。

use Log;でLogクラスを読み込んで、
handle関数でLogを吐き出すようにしてます。
デフォルトでは storage/logs/laravel.log にろぐが吐かれます。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Log;

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

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

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

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        //echo now();
        Log::info('start job');
        Log::info(now());
        Log::info('end job');
        return 0;
    }
}



ここまでうまくいけばCronの登録を

Cron登録

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

ローカル環境で試したのと同じような感じで実行確認してみてください。

以前記事にも書いたのですが、
Cron設置の際にPHPバージョンの関係でうまくコマンドが実行できないことがあったのでご参考までに♪

Posted by karaagelovers