如何在自定义处理程序中反序列化会话数据
我使用 sessionHandlerInterface
将会话保存在数据库中.一切正常.但我想从数据库中获取所有序列化数据,如
I have used sessionHandlerInterface
to save the session in database. Everything works fine. but I want to get all the serialized data from the database like
SELECT data FROM session;
并希望他们在我输出数据时解码数据.我曾尝试使用 session_decode()
来操作 $_SESSION
数组本身,这会导致问题.我只想获取序列化数据并返回解码数据.
and want them to decode the data when i output those.
i have tried using session_decode()
which is manipulating $_SESSION
array itself which is causing trouble. I just want to get the serialized data and return the decoded data.
这是保存在数据库中data
列
fb_422782977793963_code | S:216: AQAVKa4Q8sOuioW75V9Ls-cDUEizgJDX5ZkRVLArDlroFvvhasdwKvbyzKEwiMVrN7nc5ghMaw0W67jQu5kt_sc_Edm9sABzB5PakdkUpXr52AViTOltPfPBQHM9T-JoGOQ4gasdbssC8Xt93NKFvdV7XRZ7ZYGZqIsu5SFpfFBHK_hNGDdRVbnbe_xUZVP9WI4h0jDy"; fb_422782977793963_access_token | S:111: AAAGAhasdaAKL7hAvXRv6FHUj1Tk24r7j4NqDwWWUzmXDZA2Igsb1pHjuP4jbBRNKfeYzutm0MFmgxuKPg1n0NEbvZAXM3bwoNZBiZCgZDZD"; fb_422782977793963_user_id | S:15: 100004835469598";图像| S:61:HTTP://间static.ak.fbcdn.net/rsrc.php/v2/yo/r/sdIqmHJn-SK.gif";
fb_422782977793963_code|s:216:"AQAVKa4Q8sOuioW75V9Ls-cDUEizgJDX5ZkRVLArDlroFvvhasdwKvbyzKEwiMVrN7nc5ghMaw0W67jQu5kt_sc_Edm9sABzB5PakdkUpXr52AViTOltPfPBQHM9T-JoGOQ4gasdbssC8Xt93NKFvdV7XRZ7ZYGZqIsu5SFpfFBHK_hNGDdRVbnbe_xUZVP9WI4h0jDy";fb_422782977793963_access_token|s:111:"AAAGAhasdaAKL7hAvXRv6FHUj1Tk24r7j4NqDwWWUzmXDZA2Igsb1pHjuP4jbBRNKfeYzutm0MFmgxuKPg1n0NEbvZAXM3bwoNZBiZCgZDZD";fb_422782977793963_user_id|s:15:"100004835469598";picture|s:61:"http://m-static.ak.fbcdn.net/rsrc.php/v2/yo/r/sdIqmHJn-SK.gif";
它在正常的会话处理中工作正常,它按应有的方式读取和写入会话到数据库.
It works fine with normal session handling, it reads and writes session to database as it should.
我想获取活动会话的所有数据.如果我使用从会话中选择数据.它返回上面的会话数据(编码),我想获取它的解码数据.
I want to get all the data of active sessions. if i use SELECT data FROM sessions. it returns the above session data(encoded) i want to get the decoded data of it.
PHP serialize
和 unserialize
函数不能用于序列化和反序列化会话数据.即使(默认情况下 - 并且仅在默认情况下)序列化可能看起来相似,这两个关注单个变量内容的函数仍有重要区别only:
那些 [sessions] 是带有变量名称的序列化值列表.
Those [sessions] are a list of serialized values with their variable name.
(来自: 序列化自述文件)
因此您需要创建自己的 session_unserialize
函数来解码字符串(例如通过 session_decode
) 从您的数据库返回.注意这需要里面的所有东西,例如如果会话包含序列化对象,则需要加载类定义.
So you would need to create your own a session_unserialize
function that is able to decode the string (e.g. via session_decode
) which is returned from your database. Take care that this needs everything in there, e.g. if the session contains serialized objects, the class definitions needs to be loaded.
一个示例性的 session_unserialize
函数可能看起来像(采用: 一个会话相关答案):
An exemplary session_unserialize
function could look like (adopted from: a session related answer):
function unserialize_session($data) {
$hasBuffer = isset($_SESSION);
$hasBuffer && $buffer = $_SESSION;
session_decode($data);
$session = $_SESSION;
$hasBuffer ? $_SESSION = $buffer : unset($_SESSION);
return $session;
}