为何多进程场景下无法读取之前设置的Session变量?
以下是几种常见的导致该问题的原因:
Session文件写入未完成
PHP默认会在脚本执行结束时才将$_SESSION的内容写入服务器端的Session存储(比如文件)。如果进程2在进程1完成写入操作前就启动并读取Session,就只能拿到框架自动生成的_ci_last_regenerate字段,无法获取进程1设置的变量。Session存储配置不一致
若进程1和进程2的Session存储配置不同:比如进程1用默认文件存储,进程2配置了Redis/数据库存储;或者文件存储的session.save_path路径不一致,进程2指定session_id后无法找到对应存储中的数据,会自动初始化新Session,仅保留框架默认标识。Session ID传递或解析错误
检查进程2中$_COOKIE['cookie_session']的值是否和进程1生成的session_id完全一致——是否存在大小写差异、字符截断、转义问题。如果ID不匹配,session_start()会创建新的空Session,自然看不到之前的变量。Session文件权限问题
进程1创建的Session文件,进程2没有读取权限。例如进程1以www-data用户运行,进程2以CLI用户运行,此时进程2无法读取该文件,会自动生成新Session,仅能看到框架默认字段。CodeIgniter框架Session机制的兼容性问题
_ci_last_regenerate是CodeIgniter Session类自动添加的字段,说明进程2启用了CI的Session。如果进程1是通过原生PHP而非CI的Session类设置的变量,两者的Session数据序列化/加密格式不兼容,进程2用CI读取时无法解析原生设置的变量,只能看到框架自身的字段。
内容的提问来源于stack exchange,提问作者richie

