Можно ли использовать несколько независимых $ _SESSION в одном скрипте PHP? - PullRequest
2 голосов
/ 30 июня 2010

Я хочу использовать два независимых $ _SESSION в одном скрипте PHP.

Я попытался проверить, возможно ли это, используя следующий код.

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' => 'test_one'), а сеанс с именем 'session_two' содержит массив ('session_two_var' => 'test_two'). Вместо этого, session_two, кажется, тот же сеанс, что и session_one.

Если я вставлю строку 'session_regenerate_id ();' после второго 'session_start ();' В строке, для 'session_two' сообщается другой идентификатор сеанса, но в остальном выходные данные совпадают Смотри ниже.

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 ) 

Что я делаю не так?

Я знаю, что подобные вопросы задавались ранее на этом форуме, здесь и здесь , но ответы, предложенные до сих пор, не смогли меня просветить.

Любая помощь будет высоко ценится.

Ответы [ 3 ]

3 голосов
/ 30 июня 2010

Идентификатор сеанса считывается из файла cookie при запуске первого session_start() и остается на месте, даже если вы используете session_write_close() (в противном случае вы не сможете вызвать session_start(), чтобы открыть тот же сеанс)

У меня нет PHP, чтобы проверить это, но теоретически вы можете сделать session_id($_COOKIE['session_two']); перед вторым session_start(), чтобы переключиться на правильный идентификатор.

Возможно, у меня неправильное имя файла cookie, поэтому вы можете printr($_COOKIE); посмотреть, какие файлы cookie установлены.

Редактировать: Я забыл упомянуть: имя файла cookie сеанса основано на session_name, или, по крайней мере, так, если вы используете только один сеанс в файле.

1 голос
/ 18 июня 2012

Мое решение

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();
1 голос
/ 30 июня 2010

Согласно документам ,

Начиная с PHP 4.3.3, вызов session_start () после ранее запущенного сеанса приведет к ошибке уровня E_NOTICE.Кроме того, начало второго сеанса будет просто игнорироваться.

Моя интерпретация заключается в том, что нет, вы не можете использовать session_start () более одного раза на странице независимо от имени.

регенерат_ид () меняет идентификатор для первого сеансаи второй session_start игнорируется.Вот почему вы видите описанное поведение.

Я бы посоветовал сообщить нам, чего вы хотите достичь, и, возможно, кто-то порекомендует другой способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...