thinkphp框架下session 存入mongo

最近做系统的时候处理到session入数据库问题 , 由于是在thinkphp框架下, 查看了下框架session相关代码, 发现原框架默认支持mysql数据库 ,

于是对原Session驱动做了相应修改 , 使其支持mongo数据库存储session

修改的相关文件是\Think\Session\Driver\Db\Db.class.php , 本人使用的是TP3.2,2版本 , 修改后的Db.class.php代码如下:

<?php
namespace Think\Session\Driver;

class Db
{
    const MONGO_EXPIRY = 3;
    private $host = '';
    private $port = '';
    private $username = '';
    private $password = '';
    private $dbname = '';
    private $dbsession = '';
    private $__mongo_collection = NULL;
    private $__current_session = NULL;

    /**
     * Default constructor set default parameter
     * @access public
     */
    public function __construct()
    {
        $this->host = C('DB_HOST');
        $this->port = C('DB_PORT');
        $this->username = C('DB_USER');
        $this->password = C('DB_PWD');
        $this->dbname = C('DB_NAME');
        $this->dbsession = C('SESSION_TABLE');
        $this->__connect();
        session_set_save_handler(
            array(&$this, 'open'),
            array(&$this, 'close'),
            array(&$this, 'read'),
            array(&$this, 'write'),
            array(&$this, 'destroy'),
            array(&$this, 'gc')
        );
    }

    /**
     * connectes the mongo database and create collection
     * @access private
     */
    private function __connect()
    {
        $connection_string = sprintf('mongodb://%s:%s', $this->host, $this->port);
        if ($this->username != null && $this->password != null) {
            $connection_string = "mongodb://{$this->username}:{$this->password}@{$this->host}:{$this->port}";
            $connection_string = sprintf('mongodb://%s:%[email protected]%s:%s', $this->username, $this->password, $this->username, $this->password);
        }
        $object_mongo = new \Mongo($connection_string);
        $object_mongo = $object_mongo->{$this->dbname};
        $this->__mongo_collection = $object_mongo->{$this->dbsession};
    }

    /**
     *
     * check for collection object
     * @access public
     * @param string $session_path
     * @param string $session_name
     * @return boolean
     */
    public function open($session_path, $session_name)
    {
        $result = false;
        if ($this->__mongo_collection != NULL) {
            $result = false;
        }
        return $result;
    }

    /**
     *
     * doing noting
     * @access public
     * @return boolean
     */
    public function close()
    {
        return true;
    }

    /**
     *
     * Reading session data based on id
     * @access public
     * @param string $session_id
     * @return mixed
     */
    public function read($session_id)
    {
        $result = NULL;
        $expiry = time();
        $query['_id'] = $session_id;
        $query['expiry'] = array('$gte' => $expiry);
        $result = $this->__mongo_collection->findone($query);
        if ($result) {
            $this->__current_session = $result;
        }
        return $result['data'];
    }

    /**
     *
     * Writing session data
     * @access public
     * @param string $session_id
     * @param mixed $data
     * @return boolean
     */
    public function write($session_id, $data)
    {
        $result = true;
        $expiry = $this->__getExpriry();
        $session_data = array();
        if (empty($this->__current_session)) {
            $session_id = $session_id;
            $session_data['_id'] = $session_id;
            $session_data['data'] = $data;
            $session_data['expiry'] = $expiry;
        } else {
            $session_data = (array)$this->__current_session;
            $session_data['data'] = $data;
            $session_data['expiry'] = $expiry;

        }
        $query['_id'] = $session_id;
        $record = $this->__mongo_collection->findOne($query);
        if ($record == null) {
            $this->__mongo_collection->insert($session_data);
        } else {
            $record['data'] = $data;
            $record['expiry'] = $expiry;
            $this->__mongo_collection->save($record);
        }
        return true;
    }

    /**
     *
     * remove session data
     * @access public
     * @param string $session_id
     * @return boolean
     */
    public function destroy($session_id)
    {
        $query['_id'] = $session_id;
        $this->__mongo_collection->remove($query, true);
        return true;
    }

    /**
     *
     * Garbage collection
     * @access public
     * @return boolean
     */
    public function gc()
    {
        $query = array();
        $query['expiry'] = array(':lt' => time());
        $this->__mongo_collection->remove($query, array('justOne' => false));
        return true;

    }

    /**
     * get expiry
     * @access private
     * @return int
     */
    private function __getExpriry()
    {
        return time() + self::MONGO_EXPIRY;
    }
}
时间: 2024-11-06 19:58:08

thinkphp框架下session 存入mongo的相关文章

Thinkphp框架下(同服务器下)不同二级域名之间session互通共享设置

在Thinkphp框架下根目录打开index.php 在头部加入如下代码即可: //入口文件 define('DOMAIN','abc.com');//abc.com换成自己的跟域名 //以下两行是为了子域名共享SESSION 注意 DOMAIN 需要改为实际的域名 ini_set('session.cookie_path', '/'); ini_set('session.cookie_domain', DOMAIN);

ThinkPHP实现将SESSION存入MYSQL的方法

首先index.php中设置为: <?phpdefine('APP_DEBUG', true);//设置为调试模式require '../ThinkPHP/ThinkPHP.php';//设置入口文件ini_set("session.save_handler", "user");//设置PHP的SESSION由用户定义 在config.php中设置为: <?phpreturn array(//'配置项'=>'配置值'      // 添加数据库配置

thinkphp框架下404页面设置

404页面即系统在找不到请求的操作方法和找不到请求的控制器名称时的一种报错行为的优化. 第一步:在thinkphp框架中的Home/Comtroller中建一个EmptyController.class.php,其代码如下: <?phpnamespace Home\Controller;use Think\Controller;class EmptyController extends Controller{     //空操作_empty()方法    function _empty(){  

Thinkphp框架下设置session的过期时间

打开项目中的配置文件,添加session的过期配置,如下: 'SESSION_OPTIONS' => array( 'name' => 'BJYSESSION', //设置session名 'expire' => 3600, //SESSION过期时间,单位秒 'use_trans_sid' => 1, //跨页传递 'use_only_cookies' => 0, //是否只开启基于cookies的session的会话方式 ),

Struts2 框架下 session 读出来为null

我用的strust2框架,开始的时候这么写的: 在 登陆函数中(注释部分): public String dealerLogin(){        EntityInfo entityinfo=dealerservice.dealerLogin(super.account,super.password);           if(entityinfo!=null){/*             ActionContext ac = ActionContext.getContext();我开始用

thinkphp框架中session常识

在看别人代码时候,发现他,在tp框架中使用session没有些session_start();然后我去查看了手册初始化设置方法 无需手动调用,在App类的初始化工作结束后会自动调用,通常项目只需要配置SESSION_OPTIONS参数即可 认情况下,初始化之后系统会自动启动session,如果不希望系统自动启动session的话,可以设置SESSION_AUTO_START为false. 'SESSION_AUTO_START' =>false session删除 session(null);

Thinkphp框架下连接两个及以上的数据库方法

在我们的实际开发者,我们经常需要链接两个以上的数据库,方法跟简单 Thinkphp文档中也有介绍:点击查看 方法如下: 第一步:配置文件config.php <?php //默认数据库1 return array( //'配置项'=>'配置值' 'DB_TYPE' => 'mysql', // 数据库类型 'DB_HOST' => '10.10.10.10', // 服务器地址 'DB_NAME' => 'user', // 数据库名 'DB_USER' => 'roo

ThinkPHP框架下,jq实现在div中添加标签并且div的大小会随之变化

php初学者,有什么不对的还请指正. 首先是在html页面中用jq实现添加标签:divAchivePersonnal是select所在的div的外层div,divselectAchivePersonnal是select的最近一层div,info内是字符串拼接,jq标签插入用append方法.接下来是调整css样式,使div会随着标签增加而加大,这里要用一个css属性overflow(亲自查),这里直接在divselectAchivePersonnal使用时不会达到你想要的效果,所以至少要有两个嵌

Thinkphp框架下PHPExcel实现excel数据的批量化导入

第一步:下载官方的PHPExcel文件,下载地址https://github.com/PHPOffice/PHPExcel 第二步:解压打开,将PHPExcel\Classes\全部文件拷贝到thinkhp项目的根目录\ThinkPHP\Library\Vendor\,如下图所示 第三步: HTML代码如下: <form action="{:U('Index/impUser')}" method="post" enctype="multipart/f