Можете ли вы переключить сеансы 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 это и в этом случае.