schedule:run — 定期ジョブを実行するコマンド

artisan

schedule:run ― Laravel Scheduler のエントリーポイント

概要

php artisan schedule:run「今の時刻に実行すべきタスクを判定し、実行する」 だけを行うコマンドです。

  • app/Console/Kernel.php(または routes/console.php)に定義したスケジュールを読み込みます。
  • すべてのイベントを走査し、isDue()true のものだけを実行します。
  • 実行はタイムゾーンに依存せず、サーバー時間をそのまま使用します。

ポイント
スケジューラは「コードに全タスクを定義」する方式なので、cron から 1 行だけ呼び出すだけで実装完了です。

実行例

# すぐに実行したい場合
php artisan schedule:run

タスクが 1 分以内に実行予定なら Starting scheduled task…Finished scheduled task… が表示されます。
何も実行されない場合は何も表示されません。

cron で自動化

本番環境では「毎分呼び出す cron を 1 行だけ設定」します。

# /etc/crontab などに追加
* * * * * php /full/path/to/artisan schedule:run >> /dev/null 2>&1
  • >> /dev/null 2>&1 で出力を捨てておけば、サーバーログは肥大化しません。
  • パスはプロジェクトルートからのフルパスを指定してください。

実装場所

スケジュールは主に次の場所で定義します。

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('emails:send')
                 ->dailyAt('13:00')
                 ->withoutOverlapping();
    }
}
  • schedule() メソッド内に Schedule オブジェクトを受け取り、任意のタスクを登録します。
  • ルート routes/console.php でも同様に Route::command() でタスクを追加できます。

よくあるトラブル

問題 原因 対策
タスクが頻繁に走る everyFiveMinutes() など短い間隔を設定している 必要な頻度に合わせて hourly(), daily() 等に変更
タスクが走らない cron が schedule:run を呼ばない cron の設定を確認し、パスと権限が正しいか確認
タスクが重複して走る 長時間実行のジョブが完了前に再度走る ->withoutOverlapping() または ->onOneServer() を使用
エラーログが確認できない cron で出力を捨てている 手動実行で php artisan schedule:run --verbose を確認

デバッグ手段

  • 実行詳細
  php artisan schedule:run --verbose

タスクの判定過程と実行結果を出力します。

  • タスク一覧
  php artisan schedule:list

定義済みタスクと次回実行時刻を確認できます。

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする