Laravel『Invalid Session Driver』の原因と対処法

NO IMAGE

Laravelの「Invalid Session Driver」は、セッションの保存方式(driver)が未対応の値になっている、または設定の読み込み不整合によって“存在しないドライバ名”を参照しているときに発生する。多くは .env の SESSION_DRIVER の値ミス(typo/古い値/環境差分)、config:cache による反映漏れ、session.php の設定改変、必要な依存(database/redis等)未準備が原因になる。まず「現在Laravelが参照しているSESSION_DRIVERが何か」と「そのドライバに必要な前提(テーブル/Redis接続/権限)が揃っているか」を切り分ける。

エラーの出方と発生条件(典型例)

典型メッセージ例。

InvalidArgumentException
Driver [rediss] is not supported.
Invalid session driver.

発生条件の典型:
・SESSION_DRIVER に存在しない値を指定(例:rediss / files / cookiee など)
・Laravelのバージョンや構成に対して不正なdriver名を指定
・本番で config:cache 済みのまま .env を変更し、古いdriverが残っている
・セッションを使うリクエスト(webミドルウェア、ログイン、CSRF、フラッシュ)で初めて落ちる
・Docker/複数環境で .env が混在し、一部だけ不正値になっている

まず確認:SESSION_DRIVER の実際の値と、configキャッシュの有無

一番最初に見るべきは .env と config/session.php の対応。
・.env:SESSION_DRIVER=xxx
・config/session.php:’driver’ => env(‘SESSION_DRIVER’, ‘file’)
設定を変えた直後に本番で直らない場合、configキャッシュが残っている可能性が高い。

php artisan config:clear
php artisan cache:clear

(本番で最適化運用なら、クリア後に config:cache までセットで実施する)

原因1:SESSION_DRIVER のtypo(存在しないドライバ名)

最頻出。

# NG例
SESSION_DRIVER=files
SESSION_DRIVER=rediss
SESSION_DRIVER=cooke

対処:Laravelがサポートする値に直す(プロジェクトで一般的なもの)。

# 例
SESSION_DRIVER=file
SESSION_DRIVER=cookie
SESSION_DRIVER=database
SESSION_DRIVER=redis

“サポートされるdriver”は config/session.php の想定と、Laravelのセッション実装が受け付ける値に依存するため、まずは file で起動確認→必要に応じて database/redis に移行が安全。

原因2:config:cache の反映漏れで古い SESSION_DRIVER を掴んでいる

.env を直したのに治らない、環境によって再現が違う場合に多い。
発生条件:
・php artisan config:cache を使っている
・.env 変更後に configキャッシュを再生成していない
対処:デプロイ手順で更新する。

php artisan config:clear
php artisan cache:clear
php artisan config:cache

セッション関連の問題は「古い設定を見ている」だけで長引きやすい。

原因3:driverは正しいが、前提(database/redis等)が未準備で別エラーに派生している

「Invalid Session Driver」は“ドライバ名が不正”が主だが、設定を直した直後に次の層で落ちることが多い。
例:databaseドライバにしたがテーブルが無い、redisにしたが接続設定が無い、など。
対処:driverごとの前提を揃える。

databaseドライバにした場合のチェック(sessionsテーブル)

発生条件:SESSION_DRIVER=database なのに sessions テーブルが無い/権限が無い。
対処:マイグレーションを用意して実行する。

php artisan session:table
php artisan migrate

複数DBを使っている場合は、config/session.php の connection 設定や .env の DB 接続先も合わせる。

redisドライバにした場合のチェック(REDIS接続・セッション用connection)

発生条件:SESSION_DRIVER=redis だが、REDIS_HOST/PORT/PASSWORD が不正、redisサービス未起動、または session用connection名がズレている。
対処:.env の Redis 設定と、config/database.php の redis セクションを確認。

# .env(例)
SESSION_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=null

環境によっては ext-redis(phpredis)や predis の有無も影響する。アプリの依存と実行環境を揃える。

fileドライバにした場合のチェック(storage権限)

発生条件:SESSION_DRIVER=file で storage/framework/sessions に書き込み権限が無い。
この場合は「Invalid Session Driver」ではなく別エラーになりやすいが、切り替え時の落とし穴として多い。
対処:storage 配下の権限/所有者を確認し、書き込み可能にする(運用方針に沿って設定)。

cookieドライバにした場合の注意点(サイズ制限・機密性)

cookieドライバはセッションをクッキーに保持するため、サイズ制限・内容の増え方に注意が必要。
発生条件:フラッシュデータや大きい配列を入れてcookieが肥大化し、挙動が不安定になる。
対処:cookieドライバで巨大データを持たない。ログインセッション用途なら file/database/redis のほうが扱いやすい。

サンプル:環境ごとに安全に切り替える .env 例

ローカルは file、ステージング/本番は redis/database にする形が多い。

# local
SESSION_DRIVER=file

# production(例)
SESSION_DRIVER=redis

切り替えたら必ず configキャッシュを更新し、セッション保存先の前提(テーブル/Redis)も揃える。

サンプル:セッションを使う最小確認(動作チェック)

セッションが動くかの確認用。

Route::get('/session-test', function () {
    session(['k' => 'v']);
    return response()->json([
        'k' => session('k'),
        'driver' => config('session.driver'),
    ]);
});

このエンドポイントが 500 にならず、driver と値が返ってくれば、少なくとも “driver認識と保存” は通っている。

チェックリスト(上から順に確認する)

1) エラーメッセージに出ている driver 名(例:[rediss])は .env の SESSION_DRIVER と一致しているか
2) SESSION_DRIVER にtypoが無いか(file/redis/database/cookie 等、正しい値か)
3) .env変更後に config:clear を実施し、古い設定キャッシュを排除したか(本番は config:cache も再生成)
4) databaseなら sessions テーブルを作成し migrate 済みか
5) redisなら REDIS_* 設定と redis サービス稼働が揃っているか
6) fileなら storage/framework/sessions の書き込み権限があるか
7) 複数環境/コンテナで .env が混在していないか(ステージングだけ違う等)