I want to use two independent $_SESSIONs in a single PHP script.
I have attempted to verify that this is possible using the following code.
开发者_如何转开发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";
Output:
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 )
I expect the output to show that the session named 'session_one' contains array('session_one_var' => 'test_one') and the session named 'session_two' contains array('session_two_var' => 'test_two'). Instead, 'session_two' seems to be the same session as 'session_one'.
If I insert a line 'session_regenerate_id();' after the second 'session_start();' line, a different session id is reported for 'session_two', but the output is otherwise the same. See below.
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 )
What am I doing wrong?
I know similar questions have been asked on this forum before, here and here, but the answers offered so far have failed to enlighten me.
Any help will be much appreciated.
The session ID is read from a cookie when you run the first session_start()
and sticks around even if you use session_write_close()
(otherwise you wouldn't be able to call session_start()
to reopen the same session)
I don't have PHP handy here to test this, but in theory, you can do session_id($_COOKIE['session_two']);
before the second session_start()
to switch to the correct ID.
I may have the cookie name wrong, though, so you may want to printr($_COOKIE);
to see which cookies are set.
Edit: I forgot to mention: The session's cookie name is based on session_name
, or at least it is if you only use a single session in a file.
According to the docs,
As of PHP 4.3.3, calling session_start() after the session was previously started will result in an error of level E_NOTICE. Also, the second session start will simply be ignored.
My interpretation is that no, you cannot use session_start() more than once per page, regardless of the name.
The regenerate_id() is changing the ID for the first session, and the second session_start is being ignored. That is why you see the behavior described.
I'd suggest letting us know what you're seeking to accomplish by doing this, and probably someone can recommend another way to do it.
My solution is
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();
精彩评论