我想知道为什么session_name()
似乎只有一次工作?
我使用session_name()
的情况是我有一个PHP脚本,它接收带有2个cookie的HTTP请求:
Cookie: PHPSESSNAME1=sessionid1; PHPSESSNAME2=sessionid2
我使用PHP的session_name()
函数来指示我想要开始的会话的名称(例如PHPSESSNAME1
或PHPSESSNAME2
),因此期望此信息是用于指示用于确定 session_id 的相应cookie。
对于案例PHPSESSNAME1
:
session_name('PHPSESSNAME1');
session_start();
echo session_id();
session_write_close();
// outputs -> 'sessionid1'
并且等于PHPSESSNAME2
session_name('PHPSESSNAME2');
session_start();
echo session_id();
session_write_close();
// outputs -> 'sessionid2'
每次session_name()
调用导致相应的 session_id 被读取时。仅按一次使用session_name()
函数。
但是,它不能一起使用
//(1) start session named PHPSESSNAME1
session_name('PHPSESSNAME1');
session_start();
echo session_id();
session_write_close();
echo ' , ';
//(2) continue with PHPSESSNAME2
session_name('PHPSESSNAME2');
session_start();
echo session_id();
session_write_close();
// outputs -> 'sessionid1 , sessionid1'
结果显示,在使用名为PHPSESSNAME1
的第一个会话之后,对session_name('PHPSESSNAME2');
的另一个调用没有 - 正如我所想 - 使#34; PHP会话变得神奇“#34;将会话ID 更新为sessionid2
的正确值。
阅读文档:
会话名称重置为存储在session.name中的默认值 在请求启动时。因此,您需要调用session_name() 每个请求(以及session_start()或session_register()之前的请求 叫)。
让我想一想,session_start
的设计缺点是只工作一次,因此我必须手动修补第二个会话PHPSESSNAME2
的session_id的更新,例如像这样的事情
session_name('PHPSESSNAME2');
// manually update the session_id (as session_name only works once)
session_id(isset($_COOKIE['PHPSESSNAME2'])?$_COOKIE['PHPSESSNAME2']: null);
session_start();
因此我的问题: 有一个很好的理由,为什么session_name只能工作一次,或者这仅仅是PHP会话处理的缺陷?