概述:
我有一个基于Symfony1构建的应用程序,但我正在使用Symfony2构建新部件。我已经在Symfony2上移动了登录/注销操作,并使Symfony1从Symfony2读取会话数据。通过告诉Symfony2在默认的PHP $ _SESSION中编写会话数据,它工作得很好,一切都在数组中,Symfony1可以读取数据并自动登录我的用户。
现在我将Symfony1和Symfony2应用程序移动到各自的VM上。因此,我不是在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_ *东西是metadatabags。问题是我无法找到序列化发生的位置。为了能够反序列化,我需要找到它是如何序列化的。我发现的最近的地方是SessionHandlerProxy:
public function write($id, $data)
{
return (bool) $this->handler->write($id, $data);
}
这里传递的$ data包含序列化数据,但我在代码中找不到它。
运气好吗?
答案 0 :(得分: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 - 这可能就是你要找的东西。