如何实现Laravel与同库子域名下非Laravel PHP应用共享Session?
Laravel与子域名非Laravel PHP应用Session共享实现方案
你当前已经满足同根域名、共用数据库两个核心前提,不需要额外搭建跨域服务,按以下步骤配置即可实现跳转时的用户状态一致:
1. 统一Cookie全局配置
Session是靠Cookie传递ID实现身份识别的,第一步必须让两个应用能读取到同一个Session ID Cookie:
- Laravel侧修改
config/session.php配置:domain设置为根域名,格式为.yourdomain.com(前面带点,兼容所有子域名和旧版浏览器)path设置为/,保证全站路径可访问Cookiecookie统一Cookie名称,建议直接用原生PHP默认的PHPSESSID,减少非Laravel应用的改动量secure、http_only、same_site三个参数记下来,后续非Laravel侧要完全对齐,普通场景下same_site设为Lax即可,存在POST跨子域跳转的场景设为None并开启HTTPSencrypt设为false,否则Laravel会加密Session内容,非Laravel应用无法解密读取- 改完执行
php artisan config:cache清除配置缓存
- 非Laravel PHP侧配置:
没有框架接入的原生应用,在调用session_start()前通过ini_set()设置参数,或直接修改php.ini:
注意必须在所有内容输出前启动Session,否则Cookie无法正常下发。session.cookie_domain = ".yourdomain.com" session.cookie_path = "/" session.cookie_httponly = 和Laravel配置一致 session.cookie_secure = 和Laravel配置一致 session.cookie_samesite = "Lax" // 和Laravel配置一致 session.name = "PHPSESSID" // 和Laravel的cookie配置一致
2. 统一Session存储与读写规则
不要用默认的文件存储(两个应用的Session文件默认路径不一致,就算ID相同也读不到内容),直接复用现有共用数据库做Session存储:
- Laravel侧切换驱动为数据库:
执行命令生成Session表并执行迁移:
然后修改php artisan session:table php artisan migrateconfig/session.php的driver为database即可。 - 非Laravel侧实现兼容的数据库Session Handler:
Laravel生成的Session表结构固定为id(varchar 128)、user_id(可空)、ip_address、user_agent、payload(longtext)、last_activity(int),非Laravel侧实现自定义Session读写逻辑时注意格式对齐:- 读逻辑:拿到Session ID后查对应记录,取
payload字段先做base64_decode,再用unserialize()解析成数组即可拿到Session内容 - 写逻辑:把要存的Session数组用
serialize()序列化后再做base64_encode存入payload字段,last_activity字段存当前time()时间戳即可 - 垃圾回收:直接按
last_activity字段清理超过有效期的记录即可,和Laravel的过期逻辑完全对齐。
- 读逻辑:拿到Session ID后查对应记录,取
3. 登录态同步与校验
配置完成后做三步验证,避免跳转丢状态:
- 先验证Cookie传递:在两个应用分别打印Cookie列表,确认能拿到同名、同值的Session ID,没有被浏览器拦截
- 再验证Session读写:在Laravel中存入测试值
session(['test_shared' => 123]),跳转到非Laravel应用打印$_SESSION['test_shared'],能拿到值说明Laravel写入、非Laravel读取正常;反向写入测试同理 - 最后对齐登录态字段:两个应用共用同一套用户表的前提下,统一在Session中存储用户ID的字段名(比如都叫
auth_uid),Laravel侧可以自定义Auth Guard,直接从Session读取该字段查询用户表完成登录校验,不需要兼容Laravel默认的用户序列化格式,减少适配成本。
常见踩坑点
- 不要混用序列化格式:如果非Laravel应用用
json_encode存储Session内容,Laravel侧也要对应修改读写逻辑,一边用PHP序列化、一边用JSON会直接读取出错 - Cookie的Secure参数必须一致:如果一个站点开HTTPS一个没开,
secure设为true时HTTP站点完全拿不到Cookie,建议全站统一开HTTPS后再开启该配置 - Session ID长度要留足:数据库的
id字段长度至少设为128位,避免PHP高版本开启长Session ID时写入失败
内容的提问来源于stack exchange,提问作者victor ukafor
相关产品推荐
相关产品推荐

