1. 程式人生 > >thinkphp框架下session 存入mongo

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

相關推薦

thinkphp框架session 存入mongo

最近做系統的時候處理到session入資料庫問題 , 由於是在thinkphp框架下, 查看了下框架session相關程式碼, 發現原框架預設支援mysql資料庫 ,  於是對原Session驅動做了相應修改 , 使其支援mongo資料庫儲存session 修改的相關檔

漲知識,漲知識 :ThinkPHP框架Where條件查詢Mysql數據庫某字段是否為空

field 打印 想要 sts bsp ech 是否為空 time inf 代碼虐我千百遍,我對代碼如初戀~ 問題: 查詢某字段app_date數據是否為NULL,正常我們實現的辦法是: $map[‘app_data‘] = array(‘eq‘,‘null

微信公眾平臺開發[4] —— ThinkPHP 框架微信支付

    提示:文章佈局尷尬症患者,請轉移>>>MarkDown文章連結 <<<     宣告:原文主要摘自白俊遙部落格 ,部分內容針對個人事例已作修改,主要用

thinkphp框架session的使用

本文例項講述了ThinkPHP中Session用法。分享給大家供大家參考。具體如下: 在ThinkPHP封裝了Session類,使用者可以直接使用,常用的方法有: Session::set(name, value):註冊 session 。 Session::is_set(

Thinkphp框架下設置session的過期時間

pre 時間 打開 開啟 ray session exp 添加 pan 打開項目中的配置文件,添加session的過期配置,如下: ‘SESSION_OPTIONS‘ => array( ‘name‘

解決在frame框架,因為session過期使得登錄頁出現在框架內部的問題

內部 解決 ram cat -s top rip frame href <script> if(window !=top){ top.location.href=location.href; }<script>在登錄頁內加這個即可

thinkphp框架操作mongo

環境:Windows10 php5.6 mongo1.6.9 thinkphp3.2.3 mongo版本: php版本: -------------------------------------------------------------------------

thinkphp 同域名,同埠,同ipsession衝突問題

萬惡之源,就在tp設定的 sessionid 都為一個值PHPSESSID。 不管哪個專案,哪個埠,哪個域名之喲啊他們都在同伺服器下,那麼 他們儲存的session都為一個:PHPSESSID。 如果

thinkphp 如何使用SessionDB引擎把session存入資料庫

首先在專案配置檔案中寫入'SESSION_AUTO_START' => true, //是否開啟session 'SESSION_OPTIONS'=>array( 'type'=&g

thinkphp框架寫的專案在nginx無法正常訪問報錯的原因以及解決方法

nginx環境問題弄了兩天,發現網上很多人的帖子要麼複製貼上,要麼就是沒有結貼,還自己寫一句“哈哈,我自己解決了”之類的,這點我就鄙視這些發帖的同胞了,你說你問題問了,問題解決了也不給個解釋。還在搜尋的前幾頁,想沒想過需要答案的人的感受呢。滿心歡喜的去看答案,發現沒有結貼。好吧,不多說,進入正題。 我這種方

php session存入redis

ice local ons o-c php5 hat phpredis 需要 path 一、 安裝phpredis擴展php連接redis需要安裝phpredis擴展。下載地址:https://github.com/phpredis/phpredis/releases,選用

Spring Security框架Restful Token的驗證方案

false rri blob 返回 sch date html 官方 form 項目使用Restful的規範,權限內容的訪問,考慮使用Token驗證的權限解決方案。 驗證方案(簡要概括): 首先,用戶需要登陸,成功登陸後返回一個Token串; 然後用戶訪問有權限的內容時需要

yii框架session

name nbsp user pre log open() pan clas color $session = Yii::$app->session; $session->open(); $se

WebSocket在Struts2框架發生配置沖突的問題

發現 兩個 攔截 lte 原因 配置 soc ons 修改方法 前幾天完成了聊天功能之後,想把這個功能模塊整合進Struts2框架裏,卻發現WebSocket無法建立連接。弄了兩天才發現原因。 我的項目裏主要是兩個原因: 一、 <filter-m

ThinkPHP框架,按分類,計算商品價格區間,來完成價格搜索

_id pricedata explode eid blog class light price think //取出分類下的篩選屬性 $cateId=I(‘get.cid‘); /********計算這個分類下商品的七個價格區間的範圍******/

ThinkPhp框架:驗證碼功能

== 想要 重新 rand 註意 檢測 brush true cti Think\Verify類可以支持驗證碼的生成和驗證功能。 為了顯示這個驗證碼功能,第一要有控制器,再就是有方法,然後是顯示的頁面。 一、最簡單的方式生成驗證碼 (1)我們還是繼續在那個控制器編寫方法

ThinkPhp框架:文件上傳

load 1-1 method 文檔 文件夾 文件上傳 實例 成功 upload 實現文件上傳功能需要控制器,方法然後是顯示的頁面 1.在Controller下新建一個控制器TestController.class.php 2.創建操作方法 <?php names

微擎框架拉分頁(使用js模板引擎)

contain don obi 方式 get onf info 循環 time 1.需要分頁的頁面,引入一下文件 <script language="javascript" src="\addons\{$_GPC[‘m‘]}\template\mobile\js/re

THINKPHP 框架的模板技術

bsp index.php tom length isp 自定義 peter 引擎 運算 //echo C(‘name‘); App/Action/IndexAction.class.php文件夾下的 URL模式 //輸出URL模式//echo C(‘URL_MODEL‘)

SSM框架分頁的實現(封裝page.java和List<?>)

添加 interface jsp頁面 har show 初始化 ring array dex 之前寫過一篇博客 java分頁的實現(後臺工具類和前臺jsp頁面),介紹了分頁的原理。 今天整合了Spring和SpringMVC和MyBatis,做了增刪改查和分頁,之前的邏輯