sanctum:prune-expired — 有効期限切れのアクセストークンを削除するコマンド

artisan

php artisan sanctum:prune-expired

Laravel Sanctum のパーソナルアクセストークンを、一定時間が経過した後に自動で削除します。

目的:古くて無効になったトークンをデータベースから消去し、テーブルの肥大化を防ぐ。


コマンド概要

オプション意味デフォルト
--hours=HOURS削除対象とする「有効期限経過後の時間」24
--quiet出力を抑制false
--no-interaction対話なしで実行false

注意
このコマンドは personal_access_tokens テーブルの expires_at カラムではなく、
config/sanctum.phpexpiration(単位: 分)を基準にして削除します。
つまり、expires_atNULL でも、設定された期限が過ぎたトークンは削除対象です。


基本的な実行例

# 24時間(デフォルト)経過したトークンを削除
php artisan sanctum:prune-expired
# 48時間経過したトークンを削除
php artisan sanctum:prune-expired --hours=48
# 実行結果例
Pruning personal access tokens that have been expired for the last 48 hours...
Deleted 12 tokens.

Laravel 12.x でのスケジューリング

// app/Console/Kernel.php

protected function schedule(Schedule $schedule): void
{
    // 毎日 02:00 UTC に実行(24時間経過したトークンを削除)
    $schedule->command('sanctum:prune-expired --hours=24')
             ->dailyAt('02:00');
}

cron の設定例(サーバ側)

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

よくあるトラブルと対策

トラブル原因対策
削除されないsanctum.expirationnull / 0config/sanctum.phpexpiration を有効な整数に設定し、php artisan config:clear / php artisan config:cache を実行
トークンがまだ NULL で期限切れ扱いにならないSanctum が正しく設定されていないconfig('sanctum.expiration') を確認し、Sanctum のパッケージを再インストールまたは設定を再度見直す
スケジューラが失敗PHP パスが間違っている / 権限が不足cron の実行パスを確認し、Web サーバーのユーザー権限で artisan が実行できるかテスト
大量データで遅延personal_access_tokens が巨大大きなテーブルは定期的にスケジューリングし、必要に応じて expires_at カラムにインデックスを追加する(※カスタム実装の場合)
expires_at カラムは無視されるコマンドは sanctum.expiration のみを参照より細かい制御が必要なら、カスタムコマンドを作成するか、Sanctum のソースを fork する

実務での活用例

  • 月末バッチ
  php artisan sanctum:prune-expired --hours=720
  # 30日(720時間)以上経過したトークンを削除
  • アプリ稼働中の保守
    スケジューラを有効にして、夜間(トラフィックが少ない時間帯)に自動で実行。
    これにより、ユーザーがアプリを使用していない古いトークンが残っても、データベースが肥大化しない。

まとめ

項目内容
目的古くて無効な Sanctum トークンを自動で削除
主なオプション--hours(削除対象時間)
依存設定config/sanctum.phpexpiration
推奨スケジューラで定期実行、ログは確認して削除件数を把握

最短の使い方

php artisan sanctum:prune-expired --hours=48

これだけで 48 時間以上経過した全トークンを削除できます。

次のステップ

  • スケジューラを設定して定期実行
  • config/sanctum.phpexpiration をビジネス要件に合わせて調整
  • 定期的に削除件数を確認し、必要ならインデックスや分割テーブルでパフォーマンスを最適化

参考

  • Laravel Sanctum Docs → “Prune expired tokens”
  • Laravel 12.x Task Scheduler Docs
  • GitHub Issue #384(expires_at が無視される件)

これで、sanctum:prune-expired を実務で効果的に活用できるはずです。 Happy coding!

レン (Wren)

こんにちは。レンです。

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

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

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

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

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

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