因此,我只是测试会话并了解它们的工作原理。使用下面的代码我会想到我会得到三个不同的结果,但是在我运行它几次之后,最后两个条目是相同的。一些如何将通用会话中的值添加到第二个会话中。第一个看起来没有受到影响。
这里发生了什么?其他人的通用会话可以为我自己添加值吗?有没有办法阻止这种情况发生?
session_unset()仅用于在测试后清除。
代码:
<?php
session_id('site');
session_start();
$_SESSION['someVal']="yup";
var_dump($_SESSION);
// session_unset();
session_write_close();
session_id('another');
session_start();
$_SESSION['anotherVal']='Another';
var_dump($_SESSION);
// session_unset();
session_write_close();
session_start();
$_SESSION['newVal']='newVal';
var_dump($_SESSION);
// session_unset();
session_write_close();
?>
输出:
array (size=1)
'someVal' => string 'yup' (length=3)
array (size=2)
'anotherVal' => string 'Another' (length=7)
'newVal' => string 'newVal' (length=6)
array (size=2)
'anotherVal' => string 'Another' (length=7)
'newVal' => string 'newVal' (length=6)
答案 0 :(得分:1)
首先请注意,会话ID可能不是您认为的。如果为两个不同的用户设置相同的会话ID,他们将共享所有会话数据,通常您希望为每个用户提供不同的会话ID。
然后是因为最后两种情况共享公共会话ID。当您使用session_id()
功能时,会话ID会永久设置到脚本末尾或直到下一个session_id()
来电。
$_SESSION
都会填充 session_start()
变量,因此详细信息包括:
您在这里打开一个'site'
ID会话。 var_dump
将始终输出设置为'someVal'
的数组。
session_id('site');
session_start();
$_SESSION['someVal']="yup";
var_dump($_SESSION);
// session_unset();
session_write_close();
此处您正在使用'another'
ID打开会话。对于第一个请求,var_dump
仅输出'anotherVal'
。
session_id('another');
session_start();
$_SESSION['anotherVal']='Another';
var_dump($_SESSION);
// session_unset();
session_write_close();
最后,您再次打开'another'
会话。标识$_SESION
的{{1}}现在已设置'another'
和'anotherVal'
,这将在所有后续请求中保持(直到会话数据存在,不会被垃圾收集器删除),在第二种情况下启动'newVal'
会话时。
'another'