多端口下PHP session默认不共享,因浏览器将session_id存于cookie且绑定“域名+端口”组合,localhost:8080与localhost:8081被视为不同源,cookie不互通,导致session_start()各自生成新会话;强制共享需同步三动作:统一session.save_path、统一cookie参数(domain设为localhost)、确保共用同一php.ini配置。

为什么多端口下PHP session默认不共享
因为浏览器把 session_id 存在 cookie 里,而 cookie 默认绑定「域名 + 端口」组合。localhost:8080 和 localhost:8081 被视为两个不同源,cookie 不互通,session_start() 就会各自生成新会话,数据自然隔离。
强制共享 session 的三个必要动作
不能只改 php.ini 或只调 session_set_cookie_params(),必须三者同步生效:
- 统一
session.save_path:所有端口实例必须写入同一目录,否则 session 文件物理隔离。Windows 下推荐用绝对路径,例如:session.save_path = "C:/xampp/tmp/shared_sessions" - 统一 cookie 域名和路径:在每个站点入口(如
index.php)顶部加:session_set_cookie_params([ 'lifetime' => 0, 'path' => '/', 'domain' => 'localhost', 'secure' => false, 'httponly' => true, 'samesite' => 'Lax' ]);注意domain不能带端口,也不能写成.localhost(无效) - 确保所有端口的 PHP 配置加载同一份
php.ini:XAMPP 默认只用一个全局配置,但若你为不同端口启用了不同php_value指令(如在httpd-vhosts.conf里覆盖),就可能错乱。检查 Apache 错误日志里是否出现PHP Warning: session_start(): open(...)类报错
SMF / IPB / WordPress 等 CMS 的额外陷阱
这些系统在 session 之上还加了一层应用级会话控制,光共享 PHP session 不够:
审查 Remix v2 代码中的 v1 形态 meta 导出(v2 中为破坏性变更),cookie 安全漏洞(httpOnly、secure、密钥轮换),认证门位于错误层级,以及其他
-
$cookiename必须一致:SMF 的Settings.php中若设了$cookiename = 'SMF8080';,那 8081 实例也得改成同样值,否则 cookie 名不匹配,根本读不到 session -
$boardurl和$_SERVER['HTTP_HOST']冲突:SMF 用它拼接跳转地址,若$boardurl写死为http://localhost:8080,而请求来自 8081,就会跳回错误端口。建议统一设为http://localhost,靠反向代理或前端透传处理端口感知 - IPBoard 禁用 DB session:它的
conf_global.php若启用$INFO['sql_driver'] = 'mysql'且$INFO['sql_session'] = 1,session 会存进数据库,但默认表前缀未按端口区分,容易被覆盖。真要共享,得手动合并ibf_sessions表并确保ip_address字段不校验(开发环境可临时关掉)
验证 session 是否真正共享的最快方式
别依赖登录状态,直接测底层行为:
- 在端口 A 执行:
<?php session_start(); $_SESSION['test'] = time(); echo session_id(); ?>
- 在端口 B 执行:
<?php session_start(); var_dump($_SESSION['test']); ?>
如果输出NULL或旧时间戳,说明没共享 - 检查
session.save_path目录下是否只有一个sess_*文件被两个端口反复读写(用资源管理器刷新看修改时间),而不是各生成一堆 - 用浏览器开发者工具 → Application → Cookies,确认两个端口下
PHPSESSID的Domain列都是localhost、Path都是/、没有Port标识
最易被忽略的是:Windows 下 tmp 目录权限不足导致 session 文件创建失败,或者防病毒软件实时扫描锁住文件——这种问题不会报错,只会静默失效。










