当前位置:首页 > PHP教程 > php会话 > 列表

php中利用redis存储session实例详解

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-09 13:31:30 浏览: 评论:0 

session是一个用来可跨页面并且只在服务器上运行的全局变量了,它的作用常用于数据的安全验证了,下面小编整理了一篇php中利用redis存储session实例,大家有兴趣可进来看看.

phpinfo,可以看到session存储,可以使用files user memcache redis,使用数据库存储session的好处是较之文件存储,在大用户量下速度更快,性能更优,而且如果做分布式系统,肯定是需要使用数据库存储session的,这里总结下使用redis存储session的两种方式.

使用mysql存储session大家应该使用过,session生命周期的原理其实就是session.gcprobability,session.gcdivisor这两个参数和最大生命时间决定的,每次php请求,有一定几率触发session的检测机制,我们使用session_setsavehandler,是可以重定义session的行为的,这里有两种方式实现redis存储session.

代码实例1,代码如下:

  1. <?php 
  2. ini_set('session.gc_maxlifetime', 3600); 
  3. ini_set("session.save_handler","redis"); 
  4. ini_set("session.save_path","tcp://127.0.0.1:6379?auth=authpwd"); 
  5. session_start(); 
  6. //$_SESSION['session'] = 'this is session content!'; 
  7. echo $_SESSION['session']; 
  8. echo session_id().'<br/>'
  9. //开源软件:phpfensi.com 
  10. $redis = new redis(); 
  11. $redis->connect('127.0.0.1', 6379); 
  12. //redis用session_id作为key并且是以string的形式存储 
  13. echo $redis->get('PHPREDIS_SESSION:' . session_id()); 
  14. ?> 

代码实例2,代码如下:

  1. <?php 
  2. class RedisSessionHandler{ 
  3.     public $ttl = 1800; // 30 minutes default 
  4.     protected $db
  5.     protected $prefix
  6.     public function __construct($db$prefix = 'PHPSESSID1:',$time=1800) { 
  7.         $this->db = $db
  8.         $this->prefix = $prefix
  9.         $this->ttl =  $time
  10.     } 
  11.     function _open() 
  12.     { 
  13.         // 
  14.     } 
  15.  
  16.     function _close() 
  17.     { 
  18.         $this->db = null; 
  19.         unset($this->db); 
  20.     } 
  21.  
  22.     function _read($id
  23.     { 
  24.         $id = $this->prefix . $id
  25.         $sessData = $this->db->get($id); 
  26.         $this->db->expire($id$this->ttl); 
  27.         return $sessData
  28.     } 
  29.  
  30.     function _write($id$data
  31.     { 
  32.         $id = $this->prefix . $id
  33.         $this->db->set($id$data); 
  34.         $this->db->expire($id$this->ttl); 
  35.     } 
  36.  
  37.     function _destroy($id
  38.     { 
  39.         $this->db->del($this->prefix . $id); 
  40.     } 
  41.  
  42.     function _clean($max
  43.     { 
  44.         // 
  45.     } 
  46. $redis = new Redis(); 
  47. $redis->connect('127.0.0.1',6379); 
  48. $redis->select(1); 
  49. $SESSION_ID_PREFIX = 'RSID:'
  50. $SESSION_MAX_TIME  = 1440; 
  51. ini_set('session.gc_maxlifetime',$SESSION_MAX_TIME); 
  52. $sessHandler = new RedisSessionHandler($redis,$SESSION_ID_PREFIX,$SESSION_MAX_TIME); 
  53. session_set_save_handler( 
  54.     array($sessHandler'_open'), 
  55.     array($sessHandler'_close'), 
  56.     array($sessHandler'_read'), 
  57.     array($sessHandler'_write'), 
  58.     array($sessHandler'_destroy'), 
  59.     array($sessHandler'_clean'
  60. ); 
  61.  
  62. session_start(); 
  63. echo session_id(); 
  64. echo $_SESSION['name']='zhangcunchao'
  65. ?> 

> 第一种方式比较简单,但是无法选择库号,并且session_id的前缀信息比较难以控制,但是此方法也可以直接修改php配置文件,使所有程序的session使用redis.

> 第二种方式相对麻烦一点,但是使用起来比方方便.

> 网上有说并发一致性问题,所有的哈希算法肯定都会有这样的问题,不过可以通过ip前缀哈希组合来一定程度解决.

Tags: redis存储 session实例

分享到: