我想在一个PHP脚本中使用两个独立的$ _SESSION。
我试图使用以下代码验证这是否可行。
error_reporting(-1);
session_name('session_one');
session_start();
$_SESSION = array();
$_SESSION['session_one_var'] = 'test_one';
$output1 =
(
"session_id(): '" . session_id() . "'.<br/>\n" .
"session_name(): '" . session_name() . "'.<br/>\n" .
print_r($_SESSION, true)
);
session_write_close();
$_SESSION = array();
session_name('session_two');
session_start();
$_SESSION['session_two_var'] = 'test_two';
$output2 =
(
"session_id(): '" . session_id() . "'.<br/>\n" .
"session_name(): '" . session_name() . "'.<br/>\n" .
print_r($_SESSION, true)
);
session_write_close();
$_SESSION = array();
echo "$output1<br/>\n<br/>\n$output2";
输出:
session_id(): 'f19aecd8d3ce0c5d444456d2387c6e35'.
session_name(): 'session_one'.
Array ( [session_one_var] => test_one )
session_id(): 'f19aecd8d3ce0c5d444456d2387c6e35'.
session_name(): 'session_two'.
Array ( [session_one_var] => test_one [session_two_var] => test_two )
我希望输出显示名为'session_one'的会话包含数组('session_one_var'=&gt;'test_one'),名为'session_two'的会话包含数组('session_two_var'=&gt;'test_two')。相反,'session_two'似乎与'session_one'是相同的会话。
如果我插入一行'session_regenerate_id();'在第二个'session_start();'之后line,为'session_two'报告不同的会话ID,但输出相同。见下文。
session_id(): 'f19aecd8d3ce0c5d444456d2387c6e35'.
session_name(): 'session_one'.
Array ( [session_one_var] => test_one )
session_id(): '3bcc74a7bcbac30e680c5b94fadcede1'.
session_name(): 'session_two'.
Array ( [session_one_var] => test_one [session_two_var] => test_two )
我做错了什么?
我知道在here和here之前已在此论坛上提出了类似问题,但到目前为止提供的答案未能启发我。
非常感谢任何帮助。
答案 0 :(得分:3)
当您运行第一个session_start()
时,会从Cookie中读取会话ID,即使您使用session_write_close()
也是如此(否则您将无法调用session_start()
重新打开同一会议)
我没有方便PHP来测试这个,但从理论上讲,你可以在第二个session_id($_COOKIE['session_two']);
之前session_start()
切换到正确的ID。
我可能错误地将Cookie名称设置为错误,因此您可能希望printr($_COOKIE);
查看已设置的Cookie。
编辑:我忘了提及:会话的cookie名称基于session_name
,或者至少是你在文件中只使用一个会话。
答案 1 :(得分:1)
根据docs,
从PHP 4.3.3开始,在先前启动会话之后调用session_start()将导致级别E_NOTICE的错误。此外,第二个会话开始将被忽略。
我的解释是,不管名称如何,你不能每页多次使用session_start()。
regenerate_id()正在更改第一个会话的ID,而第二个session_start正在被忽略。这就是你看到所描述的行为的原因。
我建议让我们通过这样做来告诉我们你想要达到的目标,也许有人可以推荐另一种方式去做。
答案 2 :(得分:1)
我的解决方案是
ob_start();
$name1 = 'session_1';
session_name($name1);
if(empty($_COOKIE[$name1]))
$sid = md5(microtime(true));
else
$sid = $_COOKIE[$name1];
session_id($sid);
session_start();
$_SESSION['count']++;
print_r($_SESSION);
session_write_close();
$_SESSION = array();
$name2 = 'session_2';
session_name($name2);
if(empty($_COOKIE[$name2]))
$sid2 = md5(microtime(true));
else
$sid2 = $_COOKIE[$name2];
session_id($sid2);
session_start();
$_SESSION['count'] = $_SESSION['count'] + 2;
print_r($_SESSION);
session_write_close();
ob_end_flush();