【Laravel11】タスクスケジューリング

Laravel

Laravel11でタスクをスケジュール実行する方法の解説です。

この記事のゴール

  • Laravelのタスクスケジューリングをします
  • crontabのサービスを起動します
  • crontabの実行設定をします
  • タスクの実行結果の確認をします

前提条件

  • Ubuntu上で作業しています。
  • PHP8.2以降インストール済
  • Composerインストール済

これからやること

  • 新規プロジェクト作成
  • タスクスケジューリング
  • crontabのサービス起動
  • crontabの実行設定
  • Artisanコマンドの実行結果確認

新規プロジェクト作成

Laravel11の新規プロジェクト「task-schedule」を作成します。

composer create-project laravel/laravel:^11 task-schedule

プロジェクトフォルダの中に入ります。

cd task-schedule

タスクスケジューリング

Laravel11ではスケジュール実行するタスクは基本的には

「routes\console.php」に記述していきます。

開いて編集・保存します。

<?php

use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Process;

Artisan::command('inspire', function () {
    $this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote')->hourly();

// ここから追記
Schedule::call(function () {
    Process::run('date >> task.log');
})->everyFiveSeconds();

今回は、「Process::run()」を使ってlinuxコマンドを直接実行しています。

動作確認の為に、システムの現在日時をファイル「task.log」に追記するタスクとしています。

Artisanコマンドを実行させる場合は、

Schedule::command('app:foo')->everyFiveSeconds();

のように書くことができます。

「->everyFiveSeconds()」の箇所は頻度の設定です。

この場合は5秒毎に実行させる設定です。

頻度の設定は、1秒から年単位まで可能です。

詳細はLaravel公式ドキュメントにあります。

Laravel - The PHP Framework For Web Artisans
Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing ...

実行単位の注意点

スケジュール実行は基本的にはcrontabを利用して実行します。

crontabは実行単位が分、時、日、月、曜日の5つです。

Laravelのスケジュール実行では、

このcrontabの最小単位の1分毎にArtisanコマンド

「php artisan schedule:run」が実行されるように設定します。

このArtisanコマンド内で、最小実行単位の秒毎の実行が管理されています。

一応、「everySecond()」で秒単位の実行設定が可能ですが、

サーバーの負荷状況によって、実行のタイミングが秒単位でズレることが大いにあり得ます。

厳密に毎秒実行されなければならないタスクのスケジューリングは(現実的に無いと思いますが)推奨されません。

ということを念頭に置いてタスクスケジューリングをする必要があります。

crontabのサービス起動

crontabのサービスが稼働している環境の場合は

このステップはスキップしてください。

筆者の環境はWindows上にWSL2経由でUbuntuをインストールして使っています。

デフォルトではcrontabのサービスが起動していません。

root権限でcrontabのサービスを起動します。

sudo /etc/init.d/cron start

crontabの実行設定

crontabの実行設定はシステムレベルとユーザーレベルがありますが、ユーザーレベルで設定していきます。

crontab -e

テキストエディタが開くので次のように編集して保存します。

* * * * * cd /home/macocci7/work/task-schedule && php artisan schedule:run >> /dev/null 2>&1

タスクの実行結果確認

上記のタスクで、「task.log」に追記が行われているか

リアルタイム監視してみます。

tail -f task.log

しっかり記録されていますね。

タスクスケジューリングの無効化

考えられる選択肢は次の4つです。

1.routes\console.phpの書き換え

 → 実行箇所をコメントアウトするか削除する。

2.crontabの設定書き替え

 → 実行箇所をコメントアウトするか削除する。

3.crontabの設定リセット

 → 次のコマンドを実行する(危険なので非推奨)

crontab -r

 ※該当ユーザーの全ての実行設定が削除されるため危険。

 ※確認のインタラクションなしに強制削除されます。

4.crontabのサービス停止

 → crontabを稼働させない開発環境等ではアリ。

 → 本番環境ではアリ得ない選択肢。

sudo /etc/init.d/cron stop

本来、今回のようにログを蓄積するタスクの場合、

放置しておくと記録領域がパンクするので、

logrotate等ハウスキーピングの定期実行が不可欠ですが、

当記事では省きます。

以上です。

コメント

タイトルとURLをコピーしました