php默认使用文件存储session,如果并发量大,效率会非常低。而redis对高并发的支持非常好,可以利用redis替换文件来存储session。
php存数session主要用到了session_set_save_handler.
在使用session_set_save_handler之前,先把php.ini配置文件的session.save_hadler选项设置为user
<?php
class 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);
$retval = session_set_save_handler(
array($this,"open"),
array($this,"close"),
array($this,"read"),
array($this,"write"),
array($this,"destroy"),
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 destroy($id){
if($this->redis->delete($id)){
return true;
}
return false;
}
public function gc($maxlifetime){
return true;
}
public function __destruct(){
session_write_close();
}
}
?>
sessionManager构造函数主要用来连接redis服务器,使用session_set_slave_handler函数并设置session回调函数,并调用session_start函数开启session功能。使用时,只需要包含sessionManager类,然后实例化一个sessionManager对象。下面是一个管理session的实例。session_set.php代码如下:
<?php
include('SessionManager.php');
new SessionManager();
$_SESSION['username'] = 'captain';
?>
下面是读取session的代码.session_get.php代码如下:
<?php
include('SessionManager.php');
new SessionManager();
echo $_SESSION['username'];
?>
分别访问session_set.php和session_get.php页面,我们会发现,已经可以成功的设置和获取session了