PHP 7.1+Laravel5.5中session_start创建会话ID失败求助
我之前在Laravel项目里也踩过一模一样的坑——明明配置文件和.env都老老实实设了用File驱动,结果session_start()还是跳去连Memcached,给你几个实际排查的方向:
先清配置缓存,确保新设置生效
Laravel的配置缓存有时候会“记仇”,如果之前运行过php artisan config:cache,哪怕你后来改了.env或者配置文件,框架还是会用缓存里的旧配置。先跑这两个命令清掉缓存:php artisan config:clear php artisan cache:clear清完之后重启你的Web服务(比如Nginx/Apache),再试试会不会报错。
检查实际生效的PHP Session配置
有时候配置看起来对,但实际运行时被偷偷覆盖了。在报错的session_start()前面加几行代码,打印当前的session配置:var_dump(ini_get('session.save_handler'), ini_get('session.save_path')); exit;如果输出是
memcached和localhost:11211,说明肯定有地方改了session设置。这时候要排查:- 有没有第三方包在初始化时修改了session参数?
- 有没有自定义的全局中间件、前置脚本(比如public/index.php开头的代码)调用了
ini_set()改了session配置?
确认
session_start()的调用时机
如果你是在Laravel框架完全初始化之前调用session_start()(比如在public/index.php的最开头,或者自己写的非框架入口脚本里),那Laravel的session配置还没生效,会直接用php.ini里的默认设置。这种情况要把session相关代码移到Laravel生命周期内,比如控制器方法、路由闭包,或者框架启动后的中间件里。验证环境变量是否真的被读取
有时候服务器的系统级环境变量会覆盖.env文件的设置。在Laravel里打印一下实际的驱动值:dd(env('SESSION_DRIVER'), env('CACHE_DRIVER'));如果输出不是
file,那说明.env文件的设置没被正确读取——检查.env文件有没有语法错误(比如多余空格、引号不配对),或者服务器是否设置了同名的系统环境变量。
内容的提问来源于stack exchange,提问作者amflare

