【Laravel】毎分毎日の定期実行を実装する!schedule:runとCronの仕組み完全ガイド
Laravelで定期処理をしたいと思ったことはないでしょうか?実は簡単に実装できます。
今回は、Laravelの強力な機能である「タスクスケジュール」の使い方とそれをサーバーで動かすためのCron(クーロン)の設定方法を優しく解説します。
Laravelのタスクスケジュールとは
従来のWeb開発では、処理を5個動かしたいときサーバーのCron設定ファイルを5行書き換える必要がありました。しかし、Laravelでは「サーバー側の設定は最初の1行だけでOK」という画期的な仕組みになっています。
サーバーのCronが1分ごとにLaravelの司令塔をたたき、各処理へ命令が飛ぶイメージです。
・サーバー側(Cron):1分ごとにLaravelを起動する指示のみを出す
・Laravel側(Kernel/Console):Aの処理は毎分・Bの処理は毎時間といった具体的なスケジュールをPHPコードで管理する
これにより、ソースコードでスケジュールを管理できるようになり、複数人での開発やサーバー移転が劇的に楽になります。
実行したいコマンドを作る
まずは、実行させたい処理本体(コマンド)を作成します。今回は例として「予約記事を公開するバッチ」を作成してみます。
Artisanコマンドで生成
ターミナルで以下のコマンドを実行します。
php artisan make:command PublishReservedPosts
コマンドの中身を書く
app/Console/Commands/PublishReservedPosts.phpが生成されるので、以下のように記述します。
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\Post;
use Carbon\Carbon;
class PublishReservedPosts extends Command
{
// ターミナルで叩く時のコマンド名を設定
protected $signature = 'posts:publish-reserved';
// コマンドの説明(artisan listで見える)
protected $description = '予約日時が過ぎた記事を自動公開にします';
// 実行される具体的な処理
public function handle()
{
$now = Carbon::now();
// 予約日時を過ぎている&非公開の記事を取得して公開にする
Post::where('status', 'reserved')
->where('published_at', '<=', $now)
->update(['status' => 'published']);
$this->info('予約記事の公開処理が完了しました!');
}
}
スケジュールを登録する
作ったコマンドをどれくらいの頻度で動かすかをLaravelに登録します。
Laravel11以降の場合:routes/console.phpに追記します。
Laravel10以前の場合:app/Console/Kernel.phpのscheduleメソッド内に追記します。
設定例(毎分実行する場合)
use Illuminate\Support\Facades\Schedule;
Schedule::command('posts:publish-reserved')->everyMinute();
everyMinuteのほかにも、hourly(), daily(), weekly()などがあります。
本番サーバーのCronに登録する
最後に、サーバーが1分ごとにLaravelを見に行くように設定します。これを行わないと、ローカル環境や本番環境で自動実行が始まりません。
サーバーのCron 編集画面を開く
サーバーにSSHログインし、以下のコマンドをたたきます。
crontab -e
スケジュール用の1行を追記
一番下の行に、以下の設定を貼り付けて保存します。
* * * * * cd /あなたのプロジェクトの絶対パス && /usr/bin/php artisan schedule:run >> /dev/null 2>&1
* * * * *: 「毎分実行する」というCronの文法です。
cd /パス: 実行前にLaravelのディレクトリへ移動します。
artisan schedule:run: これがLaravelの司令塔を呼び出すコマンドです。
テスト環境(ローカル)で動作確認する方法
「本番サーバーのCronを設定する前に、手元のパソコンでちゃんと動くか試したい」という場合の2通りの方法を説明します。
手動で1回だけ実行する
設定されたスケジュールに関係なく、今すぐその場で実行タイミングを迎えているタスクを強制的に走らせます。
php artisan schedule:run
ローカルでCronの代わりに常駐させる
このコマンドをターミナルで実行しておくと、本番環境のCronの代わりに、手元のPCで1分ごとにスケジュールを監視・実行してくれます。(Ctrl+Cで止められます)
php artisan schedule:work
まとめ
Laravelのタスクスケジュールを使えば、システム内の自動処理を全てPHPコード側できれいに一元管理できます。
株式会社オートプロジェクトでは、中小企業向けのシステム・アプリケーション開発 / 外注サービスを提供しております。
貴社のニーズに応じた柔軟なサポートを行いますので、ぜひお気軽にご相談ください。

EC用公式アカウント