PHP实现Session入库存入redis的方法

2018-09-21 10:09

阅读:344

  对于大访问量的站点使用默认的Session 并不合适,我们可以将其存入数据库、或者使用Redis KEY-VALUE数据存储方案

  首先新建一个session表

   CREATE TABLE `sessions` ( `sid` char(40) NOT NULL, `updatetime` int(20) NOT NULL, `data` varchar(200) NOT NULL, UNIQUE KEY `sid` (`sid`) USING HASH ) ENGINE=MEMORY DEFAULT CHARSET=utf8;

  Mysql 的memory引擎采用内存表,所有数据存储在内存,操作速度快

   <?php //引入数据库文件 include db.php; class MySessionHandler implements SessionHandlerInterface { private $savePath; private $sessData; public $expiretime; //设置过期时间 public $db; //数据库 public function __construct($hanlder =){ $this->db = Database::getInstance(); //获取数据库实力 ///var_dump($this->db); } public function open($savePath, $sessionName) { return true; } public function close() { return true; } public function read($id) { $sql =select * from sessions where sid =$id; $result = $this->db->execute($sql); if(!empty($result)){ return $this->sessData = $result; } } //函数的参数 $id -> 当前会话ID //数据DATA -> 序列化之后的字符串 public function write($id, $data) { // echo $id; // echo $data; $now = time(); $newExp = $now+$this->expiretime; //总时间=当前时间 + 期限时间 $sql = select * from sessions where sid =$id; $result = $this->db->getOne($sql); //var_dump($result); if($data==isset($data)){ $data = $this->sessData; } if($result){ //如果存在则更新 $sql =update sessions set updatetime = $newExp,data =$data where sid = $id; //echo $sql; $update_data =$this->db->execute($sql); if($update_data){ return true; } }else{ //不存在则生成生成 $sql = insert into sessions(sid,updatetime,data) values($id,$now,$data); $insert_data = $this->db->execute($sql); if($insert_data){ return true; } } return false; } public function destroy($id) { //销毁 $sql = delete from sessions where sid=.$id; $destory = $this->db->execute($sql); if($destory){ return true; }else{ return false; } } public function gc($sessMaxLifeTime) { $t = time(); $sql =delete from sessions where $t - updatetime>${sessMaxLifeTime}; $data = $this->db->execute($this->tosql); if($data){ return true; }else{ return false; } return true; } }

  实例化

  此处 PHP 手册可以有两种方法

   1,实现了SessionHandlerInterface借口的对象,自PHP5.4可以使用

   2 ,直接使用 session_set_save_handler

   //判断PHP版本kie_path,/); ini_set(session.save_handler,user); session_module_name(user); session_set_save_handler(array($session,open),array($session,close),array($session,read),array($session,write),array($session,destory),array($session,gc)); session_start(); } $_SESSION[QQ]=QQ; echo $_SESSION[QQ];

  数据库代码 db.php

   <?php class Database{ static $instance; static $db; static function getInstance(){ if(self::$instance){ return self::$instance; }else{ return new Database(); } } public function __construct(){ self::$db = new PDO(mysql:host=localhost;dbname=session, root,); } public function getOne($sql){ $rs =self::$db->query($sql); @$rs->setFetchMode(PDO::FETCH_ASSOC);//返回关联数组 $result = $rs -> fetch(); return $result; } public function execute($sql){ $rs = self::$db->exec($sql); return $rs; } } //$data = Database::getInstance(); //var_dump($data);

  使用REDIS 存储SESSION

   <?php class SessionManager{ private $redis; private $sessionSavePath; private $sessionName; private $sessionExpireTime = 30; public function __construct(){ $this->redis = new Redis(); $this->redis->connect(127.0.0.1,6379); //连接redis $retval = session_set_save_handler( array($this,open), array($this,close), array($this,read), array($this,write), array($this,destory), array($this,gc) ); session_start(); } public function open($path,$name){ return true; } public function close(){ return true; } public function read($id){ $value = $this->redis->get($id); if($value){ return $value; }else{ return ; } } public function write($id,$data){ if($this->redis->set($id,$data)){ $this->redis->expire($id,$this->sessionExpireTime); //设置过期时间 return true; } return false; } public function destory($id){ if($this->redis->delete($id)){ return true; } return false; } public function gc($maxlifetime){ return true; } //析构函数 public function __destruct(){ session_write_close(); } } $re = new SessionManager(); $_SESSION[name] = qq; echo $_SESSION[name];

  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。


评论


亲,登录后才可以留言!