同一服务器下两个PHP应用会话冲突:session_name设置时机咨询
解决方案:必须在每个调用
session_start()的页面先设置session_name() 核心原因:
session_name()定义的是会话对应的Cookie名称,PHP每次启动会话时,会根据当前的session_name去查找浏览器里的对应Cookie。如果某页面跳过设置直接调用session_start(),PHP会使用默认的会话名称(通常是PHPSESSID),这就会和另一个应用的会话Cookie发生冲突——要么读取到错误的会话数据,要么直接覆盖对方的会话,导致其中一个应用的会话状态混乱,出现你说的冻结/无法运行的情况。实操建议:不用每个页面重复写,给每个应用做一个公共的初始化文件(比如
common.php),在里面统一设置session_name,然后所有需要启动会话的页面都先引入这个文件,再调用session_start()。
比如demo应用的初始化代码:// abc.com/demo/common.php session_name("DEMO_SESS"); // 可选:如果想彻底隔离会话存储,还可以设置不同的存储路径 // session_save_path(__DIR__ . '/sessions');然后demo的每个页面开头都加:
require_once 'common.php'; session_start();live应用同理,设置成
session_name("LIVE_SESS")即可。额外提醒:如果你的PHP配置里开启了
session.auto_start,一定要关掉,否则会在你设置session_name之前就自动启动会话,依然会导致冲突。
内容的提问来源于stack exchange,提问作者vinai
相关产品推荐
相关产品推荐

