У меня есть два приложения, которые я пытаюсь объединить. Один из них был написан мной, а другой – 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 (). Советы?
Завершая это решение, я рассматривал возможность разработки веб-службы для получения информации, но, очевидно, просто получить ее из сеанса было бы предпочтительнее, поскольку эта информация уже доступна.
Благодаря!
Ниже приведен рабочий пример переключения между сеансами:
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!
Итак, как вы видите, переменные сеанса сохраняются и восстанавливаются при смене сеанса.
Примечание: ответ ниже неверен, пожалуйста, не используйте и не проголосуйте. Я оставил его здесь как место для обсуждения
Вы должны работать (не то, чтобы я когда-либо пробовал что-то подобное), за исключением того, что вы должны вручную закрыть предыдущий сеанс перед любым вызовом 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 позаботится обо всем этом, и вы не должны с этим справляться.
Я работаю над совершенствованием этого, и вот что я придумал. Я переключаюсь на родительский сеанс, используя имена сеансов в дочерних приложениях, а затем возвращаюсь к сеансу моего дочернего приложения. Решение создает родительский сеанс, если он не существует.
$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();
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);
Вы должны использовать session_id , вы можете использовать его для установки / получения идентификатора сеанса (или имени).
Поэтому вместо использования session_name (в вашем псевдокоде) используйте session_id.
Zend_Session предлагает пространство имен для сеансов.
Экземпляры Zend_Session_Namespace являются объектами доступа для пространств с именами $ _SESSION. Компонент Zend_Session переносит существующий PHP ext / session с помощью интерфейса администрирования и управления, а также предоставляет API для Zend_Session_Namespace для сохранения пространств имен сеансов. Zend_Session_Namespace предоставляет стандартизованный объектно-ориентированный интерфейс для работы с пространствами имен, сохраняющимися в стандартном механизме сеанса PHP. Поддержка существует как для анонимных, так и для аутентифицированных (например, «login») пространств имен сеансов.
Возможно. Но я думаю, что вам нужно самому заняться сеансом:
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 это в этом случае.