Можете ли вы переключать сеансы PHP в сеанс? - PullRequest
10 голосов
/ 04 марта 2009

У меня есть два приложения, которые я пытаюсь объединить. Один был написан мной, а другой - CMS, которую я использую. Моя аутентификация происходит в том коде, который я кодировал, и я хотел бы, чтобы моя CMS знала эту информацию. Проблема в том, что CMS использует одно имя сеанса, а мое приложение использует другое. Я не хочу заставлять их использовать тот же самый из-за возможных конфликтов пространства имен, но я все еще хотел бы получить эту информацию.

Можно ли переключать имена сеансов в середине запроса? Например, сделать что-то подобное в CMS:

//session_start already called by cms by here

$oldSession = session_name();
session_name("SESSION_NAME_OF_MY_APP");
session_start();

//get values needed
session_name($oldSession);
session_start();

Хотелось бы что-нибудь подобное? Я не могу найти ничего в документах или в Интернете, если что-то подобное будет работать после вызова session_start (). Подсказки?

Опираясь на это решение, я рассматривал возможность разработки веб-службы для получения информации, но, очевидно, было бы предпочтительнее получить ее из сеанса, поскольку эта информация уже доступна.

Спасибо!

Ответы [ 7 ]

5 голосов
/ 25 октября 2010

Вот рабочий пример, как переключаться между сессиями:

session_id('my1session');
session_start();
echo ini_get('session.name').'<br>';
echo '------------------------<br>';
$_SESSION['value'] = 'Hello world!';
echo session_id().'<br>';
echo $_SESSION['value'].'<br>';
session_write_close();
session_id('my2session');
session_start();
$_SESSION['value'] = 'Buy world!';
echo '------------------------<br>';
echo session_id().'<br>';
echo $_SESSION['value'].'<br>';
session_write_close();
session_id('my1session');
session_start();
echo '------------------------<br>';
echo $_SESSION['value'];

Лог будет выглядеть так:


PHPSESSID
------------------------
my1session
Hello world!
------------------------
my2session
Buy world!
------------------------
Hello world!

Итак, как вы можете видеть, переменные сеанса сохраняются и восстанавливаются при изменении сеанса.

3 голосов
/ 04 марта 2009

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

Ваше решение должно работать (не то, чтобы я когда-либо пробовал что-то подобное), за исключением того, что вы должны вручную закрыть предыдущую сессию перед любым вызовом session_name(), так как в противном случае он молча завершится ошибкой.

Вы можете попробовать что-то вроде этого:

session_write_close();
$oldsession = session_name("MY_OTHER_APP_SESSION");
session_start();

$varIneed = $_SESSION['var-I-need'];
session_write_close();
session_name($oldsession);
session_start;

Нет необходимости связываться со значением идентификатора сеанса, будь то с помощью процедур манипулирования идентификатором сеанса в PHP или ручного манипулирования файлами cookie - PHP позаботится обо всем этом сам, и вы не должны связываться с этим.

2 голосов
/ 10 июня 2014

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

$current_session_id = session_id();
$current_session_name = session_name();

session_write_close();

$parent_session_name = 'NameOfParentSession';

// Does parent session exist?   
if (isset($_COOKIE[$parent_session_name])) {

    session_id($_COOKIE[$parent_session_name]);
    session_name($parent_session_name);
    session_start();

} else {
    session_name($parent_session_name);
    session_start();

    $success = session_regenerate_id(true);
}

$parent_session_id = session_id();

// Do some stuff with the parent $_SESSION 

// Switch back to app's session
session_write_close();
session_id($current_session_id);
session_name($current_session_name);
session_start();
1 голос
/ 04 марта 2009

session_regenerate _id ()

Руководство объясняет это довольно хорошо, но вот пример из руководства

session_start();

$old_sessionid = session_id();

session_regenerate_id();

$new_sessionid = session_id();

echo "Old Session: $old_sessionid<br />";
echo "New Session: $new_sessionid<br />";

print_r($_SESSION);
0 голосов
/ 04 марта 2009

Это возможно. Но я думаю, что вы должны выполнять сессию самостоятельно:

session_name('foo');
// start first session
session_start();

// …

// close first session
session_write_close();

session_name('bar');
// obtain session id for the second session
if (ini_get('session.use_cookies') && isset($_COOKIE[session_name()])) {
    session_id($_COOKIE[session_naem()]);
} else if (ini_get('session.use_trans_sid') && !ini_get('session.use_only_cookies') && isset($_REQUEST[session_name()])) {
    session_id($_REQUEST[session_naem()]);
}
// start second session
session_start();

// …

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

0 голосов
/ 04 марта 2009

Zend_Session предлагает пространство имен для сеансов.

Экземпляры Zend_Session_Namespace объекты доступа для слайсов пространства имен $ _SESSION. Zend_Session Компонент оборачивает существующий PHP доб / сеанс с администрацией и интерфейс управления, а также предоставление API для Zend_Session_Namespace для сохранения пространства имен сеансов. Zend_Session_Namespace предоставляет стандартизированный, объектно-ориентированный интерфейс для работы с пространствами имен сохраняется в стандарте PHP сессионный механизм. Поддержка существует для анонимный и аутентифицированный (например, "login") пространства имен сеанса.

0 голосов
/ 04 марта 2009

Вы должны использовать session_id , вы можете использовать его для установки / получения идентификатора сеанса (или имени).

Таким образом, вместо использования session_name (в вашем псевдокоде), используйте session_id.

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