Welcome 微信登录

首页 / 网页编程 / PHP / php实现Session存储到Redis

对于大访问量的站点使用默认的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版本 if(version_compare(PHP_VERSION,5.4)==1){session_set_save_handler($handler, true);session_start();}else{ini_set("session.use_trans_sid",0);ini_set("session.use_cookies",1);ini_set("session.cookie_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"];
数据库代码

<?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

<?phpclass 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"];
以上就是详细的介绍了php实现Session存储到Redis的方法,希望对大家的学习有所帮助。