Laravel 5.2 修改 SESSION_DRIVER 后必须执行 php artisan config:clear 并删除 bootstrap/cache/config.php 才生效;Redis 连接需确认 phpredis 已启用、REDIS_HOST=127.0.0.1 且 config/database.php 配置一致;跨域需设 SESSION_DOMAIN=localhost(开发)或 .example.com(生产),并验证 session()->getHandler() 返回真实驱动类型。

Mac 下 Laravel 5.2 的 Session 设置,核心不是“能不能设”,而是SESSION_DRIVER改了但没生效 —— 大部分人卡在缓存没清、Redis 连不上、或 SESSION_DOMAIN 配错导致跨域失效这三处。
确认当前生效的 Session 驱动
别猜,直接看 Laravel 实际用的是哪个驱动:
- 运行
php artisan tinker,然后输入session()->getHandler(),返回对象类型就是真实驱动(比如Illuminate\Session\CacheBasedSessionHandler表示用了 Redis) - 如果返回
Illuminate\Session\FileSessionHandler,哪怕你改了.env,也说明配置没加载成功 - Laravel 5.2 不会报错提示驱动初始化失败,它会静默 fallback 到
file,这是最常被忽略的陷阱
改 .env 后必须清缓存
Laravel 5.2 的配置加载机制是:启动时读 .env → 写入配置数组 → 缓存到 bootstrap/cache/config.php。改完不清理,等于白改。
- 修改
.env中的SESSION_DRIVER=redis或SESSION_DRIVER=database - 执行
php artisan config:clear(注意:5.2 没有config:cache命令,别乱试) - 删掉
bootstrap/cache/config.php文件(手动确认是否真删了,有时权限问题删不掉) - 重启 PHP 内置服务器(
php artisan serve)或重载 Apache/Nginx
用 Redis 驱动时 Mac 上的典型连不上问题
Mac 用户常见的是本地 Redis 跑着,但 Laravel 死活连不上 —— 多半是 config/database.php 里 Redis 配置和 .env 对不上,或者 Docker 网络没通。
- 检查
php -m | grep redis,确认redis扩展已启用(不是predis) -
.env中REDIS_HOST=127.0.0.1(别写localhost,macOS 的localhost解析可能走 IPv6) -
config/database.php里'redis'数组下'host'和'port'必须和.env一致;Laravel 5.2 默认不读.env里的 Redis 配置,全靠这里 - 进
tinker手动测:Redis::connection()->ping(),抛异常就说明连不通,别等 session 写失败才排查
跨子域或本地开发时 Session Cookie 不共享
Mac 上用 artisan serve 跑 http://localhost:8000,前端 Vue 项目跑 http://localhost:3000,Session 就是拿不到 —— 因为默认 SESSION_DOMAIN 是 null,Cookie 只发给精确匹配的域名。
- 在
.env加上SESSION_DOMAIN=localhost(开发环境)或SESSION_DOMAIN=.example.com(生产跨子域,注意开头的点) - 同时设
SESSION_SECURE=false(本地 HTTP 不用 HTTPS) - 如果前端用
fetch,必须加{ credentials: 'include' };用 Axios 就设withCredentials: true - 别在
config/session.php里硬编码'domain',优先走.env,否则多环境部署会冲突
真正难的不是配哪一行,而是你改完之后,得知道怎么验证它真的在用 Redis 而不是悄悄退化回 file —— 所以每次改完,第一件事永远是进 tinker 看 getHandler() 返回什么。


















