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

实例化

此处 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. } 
  15. $_SESSION['QQ']="QQ"; 
  16. 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. } 
  11. } 
  12. public function __construct(){ 
  13. self::$db = new PDO('mysql:host=localhost;dbname=session', 'root',''); 
  14. } 
  15.  
  16. public function getOne($sql){ 
  17. $rs =self::$db->query($sql); 
  18. @$rs->setFetchMode(PDO::FETCH_ASSOC);//返回关联数组 
  19. $result = $rs -> fetch(); 
  20. return $result; 
  21. } 
  22. public function execute($sql){ 
  23.  
  24.  
  25. $rs = self::$db->exec($sql); 
  26. return $rs; 
  27.  
  28. }  
  29.  
  30.  
  31. }  
  32. //$data = Database::getInstance(); 
  33. //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.  
  21. public function open($path,$name){ 
  22. return true; 
  23. } 
  24. public function close(){ 
  25. return true; 
  26. } 
  27. public function read($id){ 
  28. $value = $this->redis->get($id); 
  29. if($value){ 
  30. return $value; 
  31. }else{ 
  32. return ""; 
  33. } 
  34. } 
  35. public function write($id,$data){ 
  36. if($this->redis->set($id,$data)){ 
  37. $this->redis->expire($id,$this->sessionExpireTime);  
  38. //设置过期时间 
  39. return true; 
  40. } 
  41. return false; 
  42. } 
  43. public function destory($id){ 
  44. if($this->redis->delete($id)){ 
  45. return true; 
  46. } 
  47. return false; 
  48. } 
  49. public function gc($maxlifetime){ 
  50. return true; 
  51. } 
  52. //析构函数 
  53. public function __destruct(){ 
  54. session_write_close(); 
  55. } 
  56.  
  57. }  
  58. $re = new SessionManager(); 
  59. $_SESSION['name'] = "qq"; 
  60. echo $_SESSION['name']; 

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


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