如何在自定义处理程序中反序列化会话数据

时间:2012-12-14 09:35:08

标签: php session

我使用sessionHandlerInterface将会话保存在数据库中。一切正常。但我想从数据库中获取所有序列化数据,如

SELECT data FROM session;

并希望他们在输出数据时对数据进行解码。 我尝试使用session_decode()操纵$_SESSION数组本身,这会导致麻烦。我只想获取序列化数据并返回解码数据。

这是保存在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“;

它在正常的会话处理中工作正常,它会按原样读取和写入数据库。

我想获取活动会话的所有数据。如果我使用SELECT数据FROM会话。它返回上面的会话数据(编码)我想得到它的解码数据。

1 个答案:

答案 0 :(得分:2)

PHP serializeunserialize函数不能用于序列化和反序列化会话数据。即使(默认情况下 - 并且仅默认情况下)序列化可能看起来类似,但关注单个变量内容的那两个函数存在重要差异:

  

这些[sessions]是带有变量名的序列化值列表。

from: Serialized README

因此,您需要创建自己的session_unserialize函数,该函数能够解码从数据库返回的字符串(例如,通过session_decode)。注意这需要那里的一切,例如如果会话包含序列化对象,则需要加载类定义。

示例session_unserialize函数可能看起来像( 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;
}