Laravel11でタスクをスケジュール実行する方法の解説です。
この記事のゴール
- Laravelのタスクスケジューリングをします
- crontabのサービスを起動します
- crontabの実行設定をします
- タスクの実行結果の確認をします
前提条件
- Ubuntu上で作業しています。
- PHP8.2以降インストール済
- Composerインストール済
これからやること
- 新規プロジェクト作成
- タスクスケジューリング
- crontabのサービス起動
- crontabの実行設定
- Artisanコマンドの実行結果確認
新規プロジェクト作成
Laravel11の新規プロジェクト「task-schedule」を作成します。
composer create-project laravel/laravel:^11 task-schedule
![](https://macocci7.net/blog/wp-content/uploads/2024/04/laravel11_task_scheduling_01.png)
プロジェクトフォルダの中に入ります。
cd task-schedule
![](https://macocci7.net/blog/wp-content/uploads/2024/04/laravel11_task_scheduling_02.png)
タスクスケジューリング
Laravel11ではスケジュール実行するタスクは基本的には
「routes\console.php」に記述していきます。
![](https://macocci7.net/blog/wp-content/uploads/2024/04/laravel11_task_scheduling_03.png)
開いて編集・保存します。
<?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公式ドキュメントにあります。
![](https://laravel.com/img/og-image.jpg)
実行単位の注意点
スケジュール実行は基本的には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
![](https://macocci7.net/blog/wp-content/uploads/2024/04/laravel11_task_scheduling_04.png)
crontabの実行設定
crontabの実行設定はシステムレベルとユーザーレベルがありますが、ユーザーレベルで設定していきます。
crontab -e
テキストエディタが開くので次のように編集して保存します。
* * * * * cd /home/macocci7/work/task-schedule && php artisan schedule:run >> /dev/null 2>&1
![](https://macocci7.net/blog/wp-content/uploads/2024/04/laravel11_task_scheduling_05.png)
![](https://macocci7.net/blog/wp-content/uploads/2024/04/laravel11_task_scheduling_06.png)
タスクの実行結果確認
上記のタスクで、「task.log」に追記が行われているか
リアルタイム監視してみます。
tail -f task.log
![](https://macocci7.net/blog/wp-content/uploads/2024/04/laravel11_task_scheduling_07.png)
しっかり記録されていますね。
タスクスケジューリングの無効化
考えられる選択肢は次の4つです。
1.routes\console.phpの書き換え
→ 実行箇所をコメントアウトするか削除する。
2.crontabの設定書き替え
→ 実行箇所をコメントアウトするか削除する。
3.crontabの設定リセット
→ 次のコマンドを実行する(危険なので非推奨)
crontab -r
※該当ユーザーの全ての実行設定が削除されるため危険。
※確認のインタラクションなしに強制削除されます。
4.crontabのサービス停止
→ crontabを稼働させない開発環境等ではアリ。
→ 本番環境ではアリ得ない選択肢。
sudo /etc/init.d/cron stop
本来、今回のようにログを蓄積するタスクの場合、
放置しておくと記録領域がパンクするので、
logrotate等ハウスキーピングの定期実行が不可欠ですが、
当記事では省きます。
以上です。
コメント