11

我有两个要统一的应用程序。一个是我写的,另一个是我正在使用的 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 服务来获取信息,但显然只从会话中获取它会更好,因为该信息已经可用。

谢谢!

4

7 回答 7

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!

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

于 2010-10-25T09:05:19.107 回答
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 将自行处理所有这些,您不应该搞砸。

于 2009-03-04T09:24:26.887 回答
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();
于 2014-06-10T01:11:44.250 回答
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);
于 2009-03-04T09:15:00.450 回答
0

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

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

于 2009-03-04T08:56:49.027 回答
0

Zend_Session为会话提供命名空间。

Zend_Session_Namespace 实例是 $_SESSION 命名空间切片的访问器对象。Zend_Session 组件用管理接口包装现有的 PHP ext/session,并为 Zend_Session_Namespace 提供 API 以保持会话名称空间。Zend_Session_Namespace 提供了一个标准化的、面向对象的接口,用于处理 PHP 标准会话机制中持久化的名称空间。支持匿名和认证(例如,“登录”)会话名称空间。

于 2009-03-04T09:16:26.780 回答
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 在这种情况下是否也这样做。

于 2009-03-04T09:18:22.440 回答