schedule:work — 定期タスクを実行するワーカーを起動する

artisan

php artisan schedule:run とは?

Laravel のタスクスケジューラを動かすためのエントリーポイントです。
cron に 1 分ごとに実行させる だけで、Kernel.php で定義したすべてのスケジュール済みジョブが実行されます。


スケジュール定義場所

// app/Console/Kernel.php
protected function schedule(Schedule $schedule)
{
    // 例: 毎日 02:00 にコマンドを実行
    $schedule->command('emails:send')->dailyAt('02:00');

    // 例: 毎時ジョブをディスパッチ
    $schedule->job(new SyncUsers())->hourly();

    // 例: 10 分ごとにクロージャを呼び出し
    $schedule->call(fn () => Log::info('Heartbeat'))
             ->everyTenMinutes();
}

ポイント:すべてのスケジュールは Kernel.php に集約します。


実行方法

コマンド用途推奨環境
php artisan schedule:runスケジューラを 1 回だけ走らせる(cron から呼び出す)本番(1 分ごとの cron)
php artisan schedule:workスケジューラを長時間走らせる(開発・Docker など)開発・コンテナ
php artisan schedule:clearスケジュールキャッシュをクリア変更後に必須

本番 では cron で毎分呼び出すだけです。
開発時は schedule:work が便利です。


主要オプション

オプション説明必須
--only=task-name特定タスクのみ実行いいえ--only=emails:send
--queue=queue-nameジョブを指定キューでディスパッチいいえ--queue=high
--stop-when=condition条件が満たされたら停止いいえ--stop-when=not-in-production
--helpヘルプ表示いいえ--help
--verbose詳細ログいいえ--verbose

--stop-whenstopWhen() で渡したクロージャで判定します。


シンプルな実行例

// routes/console.php
Artisan::command('emails:send', function () {
    $this->info('Sending emails…');
})->describe('Send queued emails');

protected function schedule(Schedule $schedule)
{
    $schedule->command('emails:send')
             ->dailyAt('02:00')
             ->withoutOverlapping()
             ->onOneServer();
}

cron 行 (Linux)

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

よくある落とし穴

問題対策
スケジューラが動かないcron が正しいパスと PHP バイナリを指しているか確認
同時実行でジョブが重複->onOneServer()->sharedLock() を使用
ログが残らない->sendOutputTo(storage_path('logs/scheduler.log')) を追加
タイムゾーンずれ.envAPP_TIMEZONE と cron のタイムゾーンを合わせる

ベストプラクティス

実践理由
スケジュールをバージョン管理コードと同じリポジトリに置く
スケジューラ内で重い処理をしない重い作業はジョブへ委譲
withoutOverlapping() を使う同期重複を防止
変更後は schedule:clearキャッシュをリセット
ログを出力実行履歴を追える
開発時は schedule:workcron 設定不要

すぐに使えるコードスニペット

// Kernel.php
protected function schedule(Schedule $schedule)
{
    $schedule->command('emails:send')
             ->dailyAt('02:00')
             ->withoutOverlapping()
             ->sendOutputTo(storage_path('logs/email-scheduler.log'));

    $schedule->job(new SyncUsers())->hourly();

    $schedule->call(fn () => Log::info('Heartbeat'))
             ->everyTenMinutes();
}
# 本番
* * * * * php artisan schedule:run >> /dev/null 2>&1

# 開発
php artisan schedule:work

まとめ

php artisan schedule:run は「1 分ごとに呼び出すだけで、すべてのスケジュール済みタスクが自動で処理される」シンプルさが魅力です。
Kernel.php でスケジュールを宣言し、cron を 1 行だけ設定するだけで、バージョン管理済みかつ監査可能な背景ジョブシステムが完成します。

レン (Wren)

こんにちは。レンです。

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

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

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

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

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

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