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 同域名,同埠,同ip下session衝突問題
萬惡之源,就在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,做了增刪改查和分頁,之前的邏輯