【Laravel】タスクスケジューラで定期実行処理を実装する方法

当ページのリンクには広告が含まれています。
いずみ

こんな悩みを解決できる記事を書きました!

僕は現役フリーランスエンジニア(歴年)で、資格は個保有しています。

Laravelで定期実行処理をどう実装すればいいか分からない」とお考えではありませんか?

バッチ処理やレポート送信を毎回手動で実行するのは手間がかかります。

タスクスケジューラを使えば、Artisanコマンドやクロージャを好きな頻度で自動実行できます。

いずみ

Laravel 11以降はスケジュールの書き方が変わったので、変更点も含めて解説しますね。

ということで、本記事ではLaravelでタスクスケジューラを使い定期実行処理を実装する方法を解説します。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
執筆者/監修者
  • フリーランスエンジニア(保有資格個、企業と直接契約
  • ブログ・アフィリエイト歴7年(2018年〜)
  • ブランドせどりで月利50万円⇨脱サラ
  • 投資(仮想通貨・FX)歴7年(2018年〜)
  • X(旧Twitter)フォロワー約1,900人
  • 運営者情報はこちら
いずみです
目次

【Laravel】タスクスケジューラで定期実行処理を実装する方法

早速ですが、Laravelでタスクスケジューラを使い定期実行処理を実装する方法を紹介します。

サーバー側でcronを準備する

Laravelのタスクスケジューラは、サーバー側のcronに1行だけ登録しておけば動作します。

個別のタスクごとにcronエントリを増やす必要はありません。

STEP
crontabにschedule:runを登録する

サーバーのcrontabに、毎分schedule:runを実行する設定を1行追加します。

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

登録するタスクの実行タイミングは、Laravel側のコードで判断してくれます。

STEP
ローカル環境ではschedule:workで確認する

開発環境でcronを組まずに動作確認したい場合は、以下のコマンドを使います。

php artisan schedule:work

フォアグラウンドで動き続け、登録したタスクを指定タイミングで実行してくれます。

Artisanコマンドを作成してスケジュールに登録する

Laravel 11以降はKernel.phpが廃止され、routes/console.phpに直接スケジュールを記述する形になっています。

実際に定期実行したい処理を、Artisanコマンドとして作成しながら登録してみます。

STEP
Artisanコマンドを作成する
php artisan make:command SendDailyReport

作成されたapp/Console/Commands/SendDailyReport.phpに処理を記述します。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class SendDailyReport extends Command
{
    protected $signature = 'report:daily';

    protected $description = '日次レポートを送信する';

    public function handle(): void
    {
        $this->info('日次レポートを送信しました');
    }
}

コマンドクラスはapp/Console/Commands配下に置くだけで自動的に読み込まれます。

いずみ

Kernel.phpに個別登録する作業が不要になったので、ファイルを1つ作るだけで済みます。

STEP
routes/console.phpにスケジュールを登録する

Scheduleファサードを使い、作成したコマンドの実行頻度を指定します。

use App\Console\Commands\SendDailyReport;
use Illuminate\Support\Facades\Schedule;

Schedule::command(SendDailyReport::class)->dailyAt('09:00');

コマンド名の文字列を直接渡す書き方も可能です。

Schedule::command('report:daily')->dailyAt('09:00');

クロージャで直接処理を記述する方法

ちょっとした処理であれば、コマンドクラスを作らずクロージャで直接登録できます。

use Illuminate\Support\Facades\Schedule;
use Illuminate\Support\Facades\Storage;

Schedule::call(function () {
    Storage::disk('local')->delete('tmp/cache.json');
})->everyFiveMinutes();
いずみ

キャッシュファイルの削除のような軽い処理は、クロージャで書いた方が手軽です。

実行頻度と重複実行防止のオプション

実行頻度は、メソッドチェーンで細かく指定できます。

  • everyMinute():毎分実行する
  • hourly():毎時実行する
  • dailyAt('09:00'):毎日指定時刻に実行する
  • weeklyOn(1, '08:00'):毎週指定曜日・時刻に実行する
  • cron('*/15 * * * *'):cron式で直接指定する

複数台のサーバーでアプリケーションを運用している場合は、重複実行への対策も必要です。

Schedule::command('report:daily')
    ->dailyAt('09:00')
    ->withoutOverlapping()
    ->onOneServer();

withoutOverlapping()は前回の実行が終わっていない場合にスキップし、onOneServer()はキャッシュドライバを使って実行サーバーを1台に絞り込みます。

いずみ

負荷が高いバッチ処理ほど、withoutOverlapping()とonOneServer()は付け忘れないよう意識しています。

失敗時の通知とログ出力

定期実行タスクは失敗に気づきにくいため、通知とログ出力を合わせて設定しておくと安心です。

Schedule::command('report:daily')
    ->dailyAt('09:00')
    ->emailOutputOnFailure('admin@example.com')
    ->appendOutputTo(storage_path('logs/schedule.log'));

emailOutputOnFailure()はタスク失敗時に出力内容をメール送信し、appendOutputTo()は実行結果を指定したログファイルに追記します。

いずみ

本番運用するタスクには、通知先を必ずセットで登録するようにしています。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式

【厳選】フリーランスエンジニアにおすすめなエージェント3選

フリーランスエンジニアになるにはエージェントから案件をもらう必要があります。

僕が実際に利用しているおすすめエージェントを紹介しますね。

いずみ

エージェントは必ず複数登録してください。

担当者によっては「全然案件紹介してくれない…」みたいなこともあるので…

僕は実際に5つのエージェントを使い回していますよ。

フリーランスを始めるなら「

案件数マージン率単価
約88,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 業界最大級の案件数。
  • 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
  • 案件参画中のフォローの充実。

※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。

は業界最大手のフリーランスエージェントです。

とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!

いずみ

僕もはじめてフリーランスの案件を貰ったのはです。

保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。

手厚い保障を重視したいなら「

案件数マージン率単価
約10,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 手厚い保障で正社員並みの安心感。
  • 還元率60%超え&単価公開でクリアな契約。
  • 給与保障制度(審査あり)。

は手厚い保障が特徴のフリーランスエージェントです。

フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。

いずみ

僕も何度か案件を紹介してもらいました。

自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。

週2〜3日の案件探しなら「

案件数マージン率単価
約5,000件非公開
初心者福利厚生申し込み
経験者向け無料
Good Point
  • IT案件に特化したフリーランスエージェント。
  • 週2〜3日の案件が豊富。
  • リモート案件が多く、直エンドなので単価も高い。

※詳細は「【週2・3案件】ITプロパートナーズとは?メリットや利用手順を解説!」を参照。

はIT案件に特化したフリーランスエージェントです。

週2〜3日から参画できる案件が豊富なので、起業したい人にもおすすめです。

いずみ

週2〜3日の案件はある程度スキルがないと紹介してもらえない印象です。

とはいえ、週5の案件ももちろんありますし、僕が利用した時は迅速・丁寧に対応していただきました!

よくある質問

schedule:runはどのくらいの頻度でcronに登録すればいいですか?

毎分実行するよう1行だけ登録すれば十分です。

実際の実行タイミングはLaravel側のスケジュール定義が判断するため、cron側で細かく分ける必要はありません。

ローカル環境でcronを設定せずにスケジューラを試すことはできますか?

php artisan schedule:workコマンドを使えば、cron設定なしで動作確認できます。

フォアグラウンドで動き続けるため、開発中の動作チェックに向いています。

複数のサーバーで同じアプリケーションを動かしている場合、タスクが重複実行されませんか?

onOneServer()メソッドを付けると、キャッシュドライバを使って実行サーバーを1台に絞り込めます。

重複実行を避けたいバッチ処理には、必ず付けておくと安心です。

まとめ

今回は、Laravelでタスクスケジューラを使い定期実行処理を実装する方法について解説しました。

以下が本記事のまとめになります。

まとめ
  • Laravel 11以降はroutes/console.phpSchedule::command()Schedule::call()で定期実行タスクを直接登録する。
  • サーバー側のcron設定はschedule:runを毎分実行する1行だけで済む。
  • withoutOverlapping()onOneServer()を組み合わせると、重複実行を防ぎながら安全に運用できる。
まとめ
  • おすすめ本
¥2,673 (2023/07/23 15:53時点 | Amazon調べ)

Laravelの勉強なら「」が分かりやすくておすすめですよ♪

いずみ

最後までお読みいただき、ありがとうございました!

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
  • クソおすすめ本
¥4,480 (2024/06/01 23:28時点 | Amazon調べ)
いずみ

海外のエンジニアがどういった思考で働いているかが理解できます。

海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。

この記事が気に入ったら
フォローしてね!

シェアしてね!
  • URLをコピーしました!
目次