你能在会话中切换PHP会话吗?

时间:2009-03-04 08:52:07

标签: php content-management-system session single-sign-on

我有两个应用程序,我正在尝试统一。一个是我写的,另一个是我正在使用的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()之后这样的事情可行,我在文档或网络上找不到任何内容。提示?

在解决这个问题的过程中,我一直在考虑开发一个Web服务来获取信息,但显然只是从会话中获取信息会更好,因为该信息已经可用。

谢谢!

7 个答案:

答案 0 :(得分:5)

以下是如何在会话之间切换的工作示例:

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!

因此,正如您所看到的,会话变量在更改会话时保存和恢复。

答案 1 :(得分:3)

注意:以下答案不正确,请不要使用或投票。我把它留在这里作为讨论的地方

你的解决方案应该有效(不是我尝试过这样的事情),除了你必须在调用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会话ID操作例程或通过手动cookie修改来实际处理会话ID值 - PHP将自己处理所有这些并且你不应该弄乱它。

答案 2 :(得分:2)

我一直致力于完善这一点,这就是我想出来的。我在我的子应用程序中使用会话名称切换到父会话,然后返回到我的子应用程序会话。如果父会话不存在,该解决方案将创建父会话。

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您应该使用session_id,您可以使用它来设置/获取会话ID(或名称)。

因此,不要使用session_name(在伪代码中),而是使用session_id。

答案 5 :(得分:0)

Zend_Session为会话提供命名空间。

  

Zend_Session_Namespace实例是   命名空间切片的访问器对象   $ _SESSION。 Zend_Session   组件包装现有的PHP   与主管部门的分机/会议   管理界面,以及   提供API   Zend_Session_Namespace继续存在   会话命名空间。   Zend_Session_Namespace提供了一个   标准化,面向对象   用于处理命名空间的接口   坚持PHP的标准   会话机制。支持存在   匿名和身份验证   (例如,“登录”)会话命名空间。

答案 6 :(得分:0)

有可能。但我认为你必须自己做会话处理:

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在这种情况下是否会这样做。