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

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:

 代码如下复制代码

ini_set('session.gc_maxlifetime', 3600);

ini_set("session.save_handler","redis");

ini_set("session.save_path","tcp://127.0.0.1:6379?auth=authpwd");

session_start();

//$_SESSION['session'] = 'this is session content!';

echo $_SESSION['session'];

echo session_id().'
';

$redis = new redis();

$redis->connect('127.0.0.1', 6379);

//redis用session_id作为key并且是以string的形式存储

echo $redis->get('PHPREDIS_SESSION:' . session_id());

?>

代码实例2:

 代码如下复制代码
<?php

class RedisSessionHandler{

public $ttl = 1800; // 30 minutes default

protected $db;

protected $prefix;

public function __construct($db, $prefix = 'PHPSESSID1:',$time=1800) {

$this->db = $db;

$this->prefix = $prefix;

$this->ttl =  $time;

}

function _open()

{

//

}

function _close()

{

$this->db = null;

unset($this->db);

}

function _read($id)

{

$id = $this->prefix . $id;

$sessData = $this->db->get($id);

$this->db->expire($id, $this->ttl);

return $sessData;

}

function _write($id, $data)

{

$id = $this->prefix . $id;

$this->db->set($id, $data);

$this->db->expire($id, $this->ttl);

}

function _destroy($id)

{

$this->db->del($this->prefix . $id);

}

function _clean($max)

{

//

}

}

$redis = new Redis();

$redis->connect('127.0.0.1',6379);

$redis->select(1);

$SESSION_ID_PREFIX = 'RSID:';

$SESSION_MAX_TIME  = 1440;

ini_set('session.gc_maxlifetime',$SESSION_MAX_TIME);

$sessHandler = new RedisSessionHandler($redis,$SESSION_ID_PREFIX,$SESSION_MAX_TIME);

session_set_save_handler(

array($sessHandler, '_open'),

array($sessHandler, '_close'),

array($sessHandler, '_read'),

array($sessHandler, '_write'),

array($sessHandler, '_destroy'),

array($sessHandler, '_clean')

);

session_start();

echo session_id();

echo $_SESSION['name']='zhangcunchao';

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值