Можете ли вы переключить сеансы PHP в сеансе?

У меня есть два приложения, которые я пытаюсь объединить. Один из них был написан мной, а другой - 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(). Советы?

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

Спасибо!

Ответ 1

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

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!

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

Ответ 2

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

Вы должны работать (не то, чтобы я когда-либо пробовал что-то подобное), за исключением того, что вам нужно вручную закрыть предыдущий сеанс перед любым вызовом 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 позаботится обо всем этом, и вы не должны с этим связываться.

Ответ 3

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

$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 session
session_write_close();
session_id($current_session_id);
session_name($current_session_name);
session_start();

Ответ 4

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);

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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 это и в этом случае.