laravel 10 多实例共享 session 需同时满足存储一致(redis 同实例/集群+正确配置 session_driver 与 redis_client)、cookie 可达(session_domain=.example.com、session_secure_cookie 匹配环境)、客户端兼容(app_key 和 session_cookie 全局统一),缺一不可。

要让 Laravel 10 的多个实例(比如多个子应用、多台服务器或多个部署环境)共享 Session,核心不是只改一个配置,而是确保“存储一致 + Cookie 可达 + 客户端兼容”三者同时成立。Redis 是推荐方案,但必须配对正确,否则会静默失败或报 Class not found。
SESSION_DRIVER 和 REDIS_CLIENT 必须匹配
Laravel 10 默认使用 phpredis 扩展(非 predis),所以不能只写 SESSION_DRIVER=redis 就完事:
-
.env 中必须同时设置:
SESSION_DRIVER=redisREDIS_CLIENT=phpredis - 若误用
REDIS_CLIENT=predis,而 PHP 没装 predis 包,会报Class "Predis\Client" not found;
若装了 predis 却设成phpredis,则连接失败或超时。 - 验证 PHP 是否启用 phpredis:
php -m | grep redis—— 有输出才代表已启用。
Redis 连接必须指向同一实例或集群
多个 Laravel 实例要读写同一份 Session 数据,Redis 后端必须是同一个逻辑终点:
- 单实例场景:所有项目共用
config/database.php中的redis.default配置,host/port/password/database 全部一致; - 多实例 Redis 场景(如分离缓存与 Session):在
redis配置块中新增session连接项:'session' => [ 'host' => env('REDIS_HOST_SESSION'), 'port' => env('REDIS_PORT_SESSION', 6379), 'database' => env('REDIS_DATABASE_SESSION', 6) ]
然后在config/session.php中指定:'connection' => 'session' - Redis 集群场景(高可用必需):
必须用 predis(因 phpredis 原生不支持 Cluster 自动重定向);
安装:composer require predis/predis;
.env 改为:REDIS_CLIENT=predis;
连接地址需传入完整节点数组,例如:REDIS_HOST=redis://192.168.1.41:6379,redis://192.168.1.42:6379。
Cookie 域名和安全策略决定是否“真正共享”
Redis 存对了,不代表浏览器会把 session_id 发给所有服务——Cookie 的作用域才是关键:
-
SESSION_DOMAIN=.example.com(注意开头的点)——这样app.example.com和api.example.com才能共用同一 Cookie;
填example.com或留空都无效。 -
SESSION_SECURE_COOKIE=true时,浏览器只在 HTTPS 下发送 Cookie;
测试环境没配 TLS,务必设为false,否则登录后立刻丢失 Session。 -
SESSION_COOKIE建议显式统一(尤其跨项目):SESSION_COOKIE=shared_session,避免不同 APP_NAME 导致 Cookie 名冲突。 -
APP_KEY必须完全一致——Session 加密/签名依赖它,不一致会导致无法解密已存 Session。
验证和排错要点
别只看页面表现,直接查 Redis 最可靠:
- 进 Redis 执行:
keys laravel_session:*(若 config/database.php 中设置了'prefix' => 'laravel_session:');
登录后应看到新 key,TTL 应与SESSION_LIFETIME设置匹配(单位:分钟 × 60)。 - 用
artisan tinker手动写入并读取:session(['test_key' => 'verified']);session('test_key')—— 再另起一个 tinker 进程确认能否读到。 - 线上 Session 频繁丢失?优先查:
redis-cli config get maxclients(是否打满);redis-cli info clients | grep connected_clients(当前连接数);
Laravel Octane 用户必须启用 phpredis 的 connection_pool,否则连接数爆炸。











