首页 > 开发 > PHP > 正文

php实现Session存储到Redis

2024-05-04 23:40:17
字体:
来源:转载
供稿:网友

这篇文章主要介绍了php实现Session存储到Redis的方法,php Session可以保存到文本或者内存、还有数据库,本文讲的是存到Redis的方法,

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

首先新建一个session表

 

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

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

 

  1. <?php 
  2. //引入数据库文件 
  3. include "db.php"
  4. class MySessionHandler implements SessionHandlerInterface 
  5. private $savePath; 
  6. private $sessData; 
  7. public $expiretime; //设置过期时间 
  8. public $db; //数据库 
  9. public function __construct($hanlder =''){ 
  10.  
  11. $this->db = Database::getInstance();  
  12.  
  13. //获取数据库实力  
  14. ///var_dump($this->db); 
  15.  
  16.  
  17. public function open($savePath, $sessionName) 
  18.  
  19. return true
  20.  
  21. public function close() 
  22. return true
  23.  
  24. public function read($id) 
  25. {  
  26. $sql ="select * from sessions where sid ='$id'"
  27. $result = $this->db->execute($sql); 
  28. if(!empty($result)){ 
  29. return $this->sessData = $result; 
  30. //函数的参数 $id -> 当前会话ID 
  31. //数据DATA -> 序列化之后的字符串 
  32. public function write($id, $data) 
  33. // echo $id; 
  34. // echo $data; 
  35. $now = time(); 
  36. $newExp = $now+$this->expiretime; //总时间=当前时间 + 期限时间 
  37. $sql = "select * from sessions where sid ='$id'"
  38. $result = $this->db->getOne($sql); 
  39. //var_dump($result); 
  40. if($data==''||isset($data)){ 
  41. $data = $this->sessData; 
  42. if($result){ 
  43. //如果存在则更新 
  44. $sql ="update sessions set updatetime = '$newExp',data ='$data' where sid = '$id'"
  45. //echo $sql; 
  46. $update_data =$this->db->execute($sql); 
  47. if($update_data){ 
  48. return true
  49.  
  50. }else
  51. //不存在则生成生成 
  52. $sql = "insert into sessions(sid,updatetime,data) values('$id','$now','$data')"
  53. $insert_data = $this->db->execute($sql); 
  54. if($insert_data){ 
  55. return true
  56. return false
  57.  
  58. public function destroy($id) 
  59. //销毁 
  60. $sql = "delete from sessions where sid="."$id"
  61. $destory = $this->db->execute($sql); 
  62. if($destory){ 
  63. return true
  64. }else
  65. return false
  66.  
  67. public function gc($sessMaxLifeTime) 
  68. $t = time(); 
  69. $sql ="delete from sessions where $t - 'updatetime'>${sessMaxLifeTime}"
  70. $data = $this->db->execute($this->tosql); 
  71. if($data){ 
  72. return true
  73. }else
  74. return false
  75. return true

实例化

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

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

2 ,直接使用 session_set_save_handler

 

 
  1. //判断PHP版本 
  2. if(version_compare(PHP_VERSION,5.4)==1){ 
  3.  
  4. session_set_save_handler($handler, true); 
  5. session_start(); 
  6. }else{  
  7. ini_set('session.use_trans_sid',0); 
  8. ini_set('session.use_cookies',1); 
  9. ini_set('session.cookie_path','/'); 
  10. ini_set('session.save_handler','user'); 
  11. session_module_name('user'); 
  12. session_set_save_handler(array($session,"open"),array($session,"close"),array($session,"read"),array($session,"write"),array($session,"destory"),array($session,"gc")); 
  13. session_start();  
  14. $_SESSION['QQ']="QQ"
  15. echo $_SESSION['QQ']; 

数据库代码

 

 
  1. <?php  
  2. class Database{ 
  3. static $instance; 
  4. static $db; 
  5. static function getInstance(){  
  6. if(self::$instance){ 
  7. return self::$instance; 
  8. }else
  9. return new Database();  
  10. public function __construct(){ 
  11. self::$db = new PDO('mysql:host=localhost;dbname=session''root',''); 
  12.  
  13. public function getOne($sql){ 
  14. $rs =self::$db->query($sql); 
  15. @$rs->setFetchMode(PDO::FETCH_ASSOC);//返回关联数组 
  16. $result = $rs -> fetch(); 
  17. return $result; 
  18. public function execute($sql){ 
  19.  
  20.  
  21. $rs = self::$db->exec($sql); 
  22. return $rs; 
  23.  
  24. }  
  25.  
  26.  
  27. }  
  28. //$data = Database::getInstance(); 
  29. //var_dump($data); 

使用REDIS 存储SESSION

 

 
  1. <?php 
  2. class SessionManager{ 
  3. private $redis; 
  4. private $sessionSavePath; 
  5. private $sessionName; 
  6. private $sessionExpireTime = 30; 
  7. public function __construct(){ 
  8. $this->redis = new Redis(); 
  9. $this->redis->connect('127.0.0.1',6379); //连接redis 
  10. $retval = session_set_save_handler( 
  11. array($this,"open"), 
  12. array($this,"close"), 
  13. array($this,"read"), 
  14. array($this,"write"), 
  15. array($this,"destory"), 
  16. array($this,"gc"
  17. ); 
  18. session_start(); 
  19.  
  20. public function open($path,$name){ 
  21. return true
  22. public function close(){ 
  23. return true
  24. public function read($id){ 
  25. $value = $this->redis->get($id); 
  26. if($value){ 
  27. return $value; 
  28. }else
  29. return ""
  30. public function write($id,$data){ 
  31. if($this->redis->set($id,$data)){ 
  32. $this->redis->expire($id,$this->sessionExpireTime);  
  33. //设置过期时间 
  34. return true
  35. return false
  36. public function destory($id){ 
  37. if($this->redis->delete($id)){ 
  38. return true
  39. return false
  40. public function gc($maxlifetime){ 
  41. return true
  42. //析构函数 
  43. public function __destruct(){ 
  44. session_write_close(); 
  45.  
  46. }  
  47. $re = new SessionManager(); 
  48. $_SESSION['name'] = "qq"
  49. echo $_SESSION['name']; 

以上就是详细的介绍了php实现Session存储到Redis的方法,希望对大家的学习有所帮助。


注:相关教程知识阅读请移步到PHP教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表