三里屯摇滚 发表于 2012-01-08 21:26

mongodb探索2


mongodb探索2






1mongodb处理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的类 <?php

class DBConnection
{
    const HOST   = 'localhost';
    const PORT   = 27017;
    const DBNAME = 'myblogsite';
   
    private static $instance;
   
    public $connection;   
    public $database;
   
    private function __construct()
    {
      $connectionString = sprintf('mongodb://%s:%d', DBConnection::HOST, DBConnection::PORT);

      try {
            
            $this->connection = new Mongo($connectionString);
            $this->database = $this->connection->selectDB(DBConnection::DBNAME);
         
      } catch (MongoConnectionException $e) {
            throw $e;
      }
    }
   
    static public function instantiate()
    {
      if (!isset(self::$instance)) {
            $class = __CLASS__;
            self::$instance = new $class;
      }
      
      return self::$instance;
    }
   
    public function getCollection($name)
    {
      return $this->database->selectCollection($name);
    }
}
?> 3 一个处理session的类,sessionmanager: <?php

require_once('dbconnection.php');

class SessionManager{
      
    const COLLECTION = 'sessions'; //name of collection where sessions will be stored
   
    const SESSION_TIMEOUT = 600;    //Expire session after 10 mins in inactivity
   const SESSION_LIFESPAN = 3600;//1 hour
    const SESSION_NAME = 'mongosessid'; //name of the session cookie
   
    const SESSION_COOKIE_PATH = '/';
    const SESSION_COOKIE_DOMAIN = ''; //should domain name of you web app, for example .mywebapp.com
   
    private $_mongo;
    private $_collection;
   
    private $_currentSession;
   
    public function __construct()
    {
      $this->_mongo = DBConnection::instantiate();
      $this->_collection = $this->_mongo->getCollection(SessionManager::COLLECTION);
         
      session_set_save_handler(
            array(&$this, 'open'),
            array(&$this, 'close'),
            array(&$this, 'read'),
            array(&$this, 'write'),
            array(&$this, 'destroy'),
            array(&$this, 'gc')            
      );
      
      // set session garbage collection period
      ini_set('session.gc_maxlifetime', SessionManager::SESSION_LIFESPAN);

      session_set_cookie_params(SessionManager::SESSION_LIFESPAN,
                                    SessionManager::SESSION_COOKIE_PATH,
                                    SessionManager::SESSION_COOKIE_DOMAIN
      );
      
      
      session_name(SessionManager::SESSION_NAME);
      session_cache_limiter('nocache');
      session_start();
    }
   
    public function open($path, $name)
    {
      return true;
    }
   
    public function close()
    {
      return true;
    }
   
    public function read($sessionId)
    {
      $query = array(
                        'session_id' => $sessionId,
                        'timedout_at' => array('$gte' => time()),
                        'expired_at' => array('$gte' => time())
                      );
                     
      $result = $this->_collection->findOne($query);
      
      $this->_currentSession = $result;
      
      if(!isset($result['data'])){
            return '';
      }
      
      return $result['data'];
    }
   
    public function write($sessionId, $data)
    {
      $new_obj = array(
                        'data' => $data,
                        'timedout_at' => time() + self::SESSION_TIMEOUT,
                        'expired_at' => (empty($this->_currentSession)) ? time() + SessionManager::SESSION_LIFESPAN
                                                                           : $this->_currentSession['expired_at']
                         );

      $query = array('session_id' => $sessionId);
      
      $this->_collection->update(
                                    $query,
                                    array('$set' => $new_obj),
                                    array('upsert' => True)
                                  );
      return True;
    }
   
    public function destroy($sessionId)
    {
      $this->_collection->remove(array('session_id' => $sessionId));
      
      return True;
    }
   
    public function gc()
    {
      $query = array('expired_at' => array( '$lt' => time()));
      
      $this->_collection->remove($query);
      
      return True;
    }
   
    public function __destruct()
    {
      session_write_close();
    }
}

$session = new SessionManager();

如果有一天21 发表于 2012-01-09 15:31

谢谢分享
页: [1]
查看完整版本: mongodb探索2