Yii 根据sessionid获取session信息

php中将数据存储在session中的时候,会根据配置进行序列化,session_decode函数可以将session中的数据解码并重新存入$_SESSION这个全局变量中。但是如果仅仅需要解码后的数据,不需要重新存储到session中,就需要自己单独写函数来进行解码操作,具体代码如下:

// 请求入口
public function actionIndex($s_id='') {
        $session_id = $s_id;
        // '37qlrtm2vupsv6vmmi9nlbmdp5';
        $data = Yii::app()->session->readSession($session_id);
        $session_data = self::unserialize($data);
        echo CJSON::encode($session_data);
}

private 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;
    }

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 128,910评论 18 137
  • php.ini设置,上传大文件: post_max_size = 128Mupload_max_filesize ...
    bycall阅读 6,187评论 3 64
  • 一、会话控制(session与cookie) 1.cookie简介 Cookie是存储在客户端浏览器中的数据,我们...
    空谷悠阅读 380评论 0 5
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    Joyyx阅读 7,549评论 0 16
  • 教程一:视频截图(Tutorial 01: Making Screencaps) 首先我们需要了解视频文件的一些基...
    90后的思维阅读 3,749评论 0 3
  • 今天看了《摆渡人》,一直在想一个问题,如果是我,我会做出何种选择呢,冒着魂飞魄散的风险去找崔斯坦,还是平静的等待与...
    贾说会计阅读 188评论 0 0
  • 安装软件 一、导入 这里因为主要学习数据库中数据的调用,所以省略之前制作工程的步骤,拿一个已经做好的工程文件进行加...
    Android课程笔记阅读 157评论 0 1
  • 介绍读书方法和列书单的朋友比较多,今天偶把读书方法列一下,希望能给朋友们一些帮助。 1、读什么书? 首先,偶的看法...
    心灵悦读阅读 332评论 3 8