从数据库表中反序列化 php 会话数据


Unserializing php session data from db table

我有一个自定义会话处理程序来处理数据库表中的会话。它工作得很好,问题是我无法反序列化内容。

作为有人在这里指出SOQ使用session_decode($data),但这似乎不起作用。

function getSession($data)
{       
    $backup = $_SESSION;        
    session_decode($data);
    $session=$_SESSION;
    $_SESSION = $backup ;
    return $session;
}

我正在尝试的是循环访问会话表记录并逐个解码每个记录以从会话中提取一些信息。

我没有为会话处理程序自定义序列化,它默认它是什么。现在的问题是如何从序列化的会话字符串中获取额外数据?

php version 5.4+

编辑: 我没有自定义会话序列化处理程序,因为ini_get('session.serialize_handler')给了我php,这是默认值。

编辑:到目前为止一切顺利,这似乎正在工作

<?php
class Session {
    public static function unserialize($session_data) {
        $method = ini_get("session.serialize_handler");
        switch ($method) {
            case "php":
                return self::unserialize_php($session_data);
                break;
            case "php_binary":
                return self::unserialize_phpbinary($session_data);
                break;
            default:
                throw new Exception("Unsupported session.serialize_handler: " . $method . ". Supported: php, php_binary");
        }
    }
    private static function unserialize_php($session_data) {
        $return_data = array();
        $offset = 0;
        while ($offset < strlen($session_data)) {
            if (!strstr(substr($session_data, $offset), "|")) {
                throw new Exception("invalid data, remaining: " . substr($session_data, $offset));
            }
            $pos = strpos($session_data, "|", $offset);
            $num = $pos - $offset;
            $varname = substr($session_data, $offset, $num);
            $offset += $num + 1;
            $data = unserialize(substr($session_data, $offset));
            $return_data[$varname] = $data;
            $offset += strlen(serialize($data));
        }
        return $return_data;
    }
    private static function unserialize_phpbinary($session_data) {
        $return_data = array();
        $offset = 0;
        while ($offset < strlen($session_data)) {
            $num = ord($session_data[$offset]);
            $offset += 1;
            $varname = substr($session_data, $offset, $num);
            $offset += $num;
            $data = unserialize(substr($session_data, $offset));
            $return_data[$varname] = $data;
            $offset += strlen(serialize($data));
        }
        return $return_data;
    }
}
?>

用法:

<?php
Session::unserialize(session_encode());
?>

您说您正在使用自定义会话处理程序。它如何将数据写入数据库?为什么不尝试使用简单的序列化/反序列化函数?

http://php.net/manual/en/function.serialize.php