1

概述:

我有一个基于 Symfony1 构建的应用程序,但我正在使用 Symfony2 构建新部分。我已经移动了 Symfony2 上的登录/注销操作,并使 Symfony1 从 Symfony2 读取会话数据。通过告诉 Symfony2 将其会话数据写入默认的 PHP $_SESSION,它工作得很好,一切都在数组中,Symfony1 可以读取数据并自动登录我的用户。

现在我将 Symfony1 和 Symfony2 应用程序移动到它们各自的虚拟机上。因此,我没有使用 PHP $_SESSION 编写会话,而是将会话保存在 MongoDB 中(通过 MongoDbSessionHandler)。但是现在当我从 Symfony1 应用程序中读取会话数据时,我最终会得到这样的结果:

_sf2_attributes|a:0:{}_sf2_flashes|a:0:{}_sf2_meta|a:3:{s:1:"u";i:1362655964;s:1:"c";i:1362655964;s:1:"l";s:1:"0";}

它绝对不是不可序列化的。Symfony2 似乎以自己的方式序列化数据,我猜这些 _sf2_* 东西是元数据包。问题是我找不到这个序列化发生在哪里。为了能够反序列化它,我需要找到它是如何序列化的。我找到的最近的地方是在 SessionHandlerProxy 中:

public function write($id, $data)
{
    return (bool) $this->handler->write($id, $data);
}

此处传递的 $data 包含序列化数据,但我在调用它的代码中找不到。

运气好的话?

4

1 回答 1

2

MongoDbSessionHandler 在此处设置为 PHP 会话保存处理程序:https ://github.com/symfony/symfony/blob/master/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php#L349-L370

session_start() ( https://github.com/symfony/symfony/blob/master/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php#L146 ) 实际上读取会话文件/Mongo 的内容并创建全局 $_SESSION 变量:http ://www.php.net/manual/en/function.session-start.php

看看 PHP 的 session_decode 函数:http ://www.php.net/manual/en/function.session-decode.php - 这可能是你要找的。

于 2013-03-08T06:45:13.263 回答