免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1534 | 回复: 1
打印 上一主题 下一主题

[MongoDB] mongodb探索2 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-08 21:26 |只看该作者 |倒序浏览

mongodb探索2







1  mongodb处理session:

    cookie只是session绑定客户端的一种途径,其它的还有比如url等 session_set_save_handler仅仅是对服务器端,session的存储方式,默认为文件存储,可更改为任何其它存储,比如数据库,memcache等
   可以使用 session_set_save_handler的函数:
  bool session_set_save_handler(callback $open, callback $close,
callback $read, callback $write,
callback $destroy, callback $gc)
    注意: 使用本函数前,先要配置php.ini文件,session.save_hadler=user ,否则,session_set_save_handler()不会生效。

   第一个参数是打开会话时调用的处理器,接受两个参数 save_path 和 session_name,分别是会话保存路径 (要记得 PHP 默认机制是文件方式的,因此有文件路径) 和 COOKIE 中用于保存 SESSION ID 的键名,其中键名可以通过 session_name 来获取和修改

第二个参数是关闭会话时的处理器,没有参数

第三个参数是读取会话时的处理器,接受一个参数 session_id,代表 COOKIE 中保存的会话 ID

第四个参数是保存会话时的处理器,接受两个参数 session_id 和 session_data。官方手册中提及到,PHP 5.0.5 以后,close 和 write 处理器将会在类析构之后调用,因此处理器内不能使用类和抛出异常 (Exception 也是一个类) 而在析构函数内可以使用 SESSION,因此我们需要在程序中 (比如在 open 或者 read 处理器内) 声明一下保证让 session_write_close 在析构前完成

register_shutdown_function('session_write_close');

第五个参数是删除会话时的处理器,接受一个参数 session_id,代表 COOKIE 中保存的会话 ID

最后一个参数是会话过期时的处理器,接受一个参数 maxlifetime,代表超时秒数

2 一个PHP连接MONGODB的类
  1. <?php

  2. class DBConnection
  3. {
  4.     const HOST   = 'localhost';
  5.     const PORT   = 27017;
  6.     const DBNAME = 'myblogsite';
  7.    
  8.     private static $instance;
  9.    
  10.     public $connection;   
  11.     public $database;
  12.    
  13.     private function __construct()
  14.     {
  15.         $connectionString = sprintf('mongodb://%s:%d', DBConnection::HOST, DBConnection::PORT);

  16.         try {
  17.             
  18.             $this->connection = new Mongo($connectionString);
  19.             $this->database = $this->connection->selectDB(DBConnection::DBNAME);
  20.          
  21.         } catch (MongoConnectionException $e) {
  22.             throw $e;
  23.         }
  24.     }
  25.    
  26.     static public function instantiate()
  27.     {
  28.         if (!isset(self::$instance)) {
  29.             $class = __CLASS__;
  30.             self::$instance = new $class;
  31.         }
  32.         
  33.         return self::$instance;
  34.     }
  35.    
  36.     public function getCollection($name)
  37.     {
  38.         return $this->database->selectCollection($name);
  39.     }
  40. }
  41. ?>
复制代码
3 一个处理session的类,sessionmanager:
  1. <?php

  2. require_once('dbconnection.php');

  3. class SessionManager{
  4.         
  5.     const COLLECTION = 'sessions'; //name of collection where sessions will be stored
  6.      
  7.     const SESSION_TIMEOUT = 600;    //Expire session after 10 mins in inactivity
  8.      const SESSION_LIFESPAN = 3600;  //1 hour
  9.     const SESSION_NAME = 'mongosessid'; //name of the session cookie
  10.    
  11.     const SESSION_COOKIE_PATH = '/';
  12.     const SESSION_COOKIE_DOMAIN = ''; //should domain name of you web app, for example .mywebapp.com
  13.      
  14.     private $_mongo;
  15.     private $_collection;
  16.    
  17.     private $_currentSession;
  18.    
  19.     public function __construct()
  20.     {
  21.         $this->_mongo = DBConnection::instantiate();
  22.         $this->_collection = $this->_mongo->getCollection(SessionManager::COLLECTION);
  23.          
  24.         session_set_save_handler(
  25.             array(&$this, 'open'),
  26.             array(&$this, 'close'),
  27.             array(&$this, 'read'),
  28.             array(&$this, 'write'),
  29.             array(&$this, 'destroy'),
  30.             array(&$this, 'gc')            
  31.         );
  32.         
  33.         // set session garbage collection period
  34.         ini_set('session.gc_maxlifetime', SessionManager::SESSION_LIFESPAN);

  35.         session_set_cookie_params(  SessionManager::SESSION_LIFESPAN,
  36.                                     SessionManager::SESSION_COOKIE_PATH,
  37.                                     SessionManager::SESSION_COOKIE_DOMAIN
  38.         );
  39.         
  40.         
  41.         session_name(SessionManager::SESSION_NAME);
  42.         session_cache_limiter('nocache');
  43.         session_start();
  44.     }
  45.    
  46.     public function open($path, $name)
  47.     {
  48.         return true;
  49.     }
  50.    
  51.     public function close()
  52.     {
  53.         return true;
  54.     }
  55.    
  56.     public function read($sessionId)
  57.     {
  58.         $query = array(
  59.                         'session_id' => $sessionId,
  60.                         'timedout_at' => array('$gte' => time()),
  61.                         'expired_at' => array('$gte' => time())
  62.                       );
  63.                      
  64.         $result = $this->_collection->findOne($query);
  65.         
  66.         $this->_currentSession = $result;
  67.         
  68.         if(!isset($result['data'])){
  69.             return '';
  70.         }
  71.         
  72.         return $result['data'];
  73.     }
  74.    
  75.     public function write($sessionId, $data)
  76.     {
  77.         $new_obj = array(
  78.                           'data' => $data,
  79.                           'timedout_at' => time() + self::SESSION_TIMEOUT,
  80.                           'expired_at' => (empty($this->_currentSession)) ? time() + SessionManager::SESSION_LIFESPAN
  81.                                                                            : $this->_currentSession['expired_at']
  82.                          );

  83.         $query = array('session_id' => $sessionId);
  84.         
  85.         $this->_collection->update(
  86.                                     $query,
  87.                                     array('$set' => $new_obj),
  88.                                     array('upsert' => True)
  89.                                   );
  90.         return True;
  91.     }
  92.    
  93.     public function destroy($sessionId)
  94.     {
  95.         $this->_collection->remove(array('session_id' => $sessionId));
  96.         
  97.         return True;
  98.     }
  99.    
  100.     public function gc()
  101.     {
  102.         $query = array('expired_at' => array( '$lt' => time()));
  103.         
  104.         $this->_collection->remove($query);
  105.         
  106.         return True;
  107.     }
  108.    
  109.     public function __destruct()
  110.     {
  111.         session_write_close();
  112.     }
  113. }

  114. $session = new SessionManager();
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-01-09 15:31 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP