为什么PHP的session_name()函数只能运行一次?

时间:2018-04-15 16:17:46

标签: php session-cookies

我想知道为什么session_name()似乎只有一次工作?

我使用session_name()的情况是我有一个PHP脚本,它接收带有2个cookie的HTTP请求:

Cookie: PHPSESSNAME1=sessionid1; PHPSESSNAME2=sessionid2

我使用PHP的session_name()函数来指示我想要开始的会话的名称(例如PHPSESSNAME1PHPSESSNAME2),因此期望此信息是用于指示用于确定 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会话处理的缺陷?

0 个答案:

没有答案