可以在单个PHP脚本中使用多个独立的$ _SESSION吗?

时间:2010-06-30 14:44:41

标签: php session

我想在一个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 ) 

我做错了什么?

我知道在herehere之前已在此论坛上提出了类似问题,但到目前为止提供的答案未能启发我。

非常感谢任何帮助。

3 个答案:

答案 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();