PHP自带的session是文件格式存储,不利于高并发访问,所以将PHP原生的session改为redis存储。
文章方法转自不知名的大神,并自己做了写总结和修改
1 在php.ini文件中修改PHP session的默认存储方式,将文件存储修改为会话存储
#session.save_handler=file
session.save_handler = user
2 写调用redis的方法类
主要使用session_set_save_handler方法设置用户自定义会话并存储数据。
<?phpclass SessionManager{private $redis;private $session_expire_time = 3600;public function __construct(){//连接redis数据库$this->redis = new Redis();$this->redis->connect('127.0.0.1',6379) || die('连接redis服务器失败');//$this->redis->auth('password');$this->redis->select(0); //选择0号数据库//设置用户自定义会话存储函数session_set_save_handler(array($this,"open"),array($this,"close"),array($this,"read"),array($this,"write"),array($this,"destroy"),array($this,"gc"));session_start();}//open回调函数类似于类的构造函数,在会话打开的时候会被调用。//是自动开始会话或者通过调用session_start()后第一个被调用的回调函数//回调函数成功返回TRUEpublic function open(){return TRUE;}//类似于析构函数的回调函数//在write回调函数调用之后调用//当调用session_write_close()函数之后返回TRUEpublic function close(){return TRUE;}//如果会话中有数据,将返回序列化字符串//无数据则返回空字符串//自动开始会话或调用session_start()后,//通过该函数返回值填充$_seesion函数public function read($id){$value = $this->redis->get($id);if($value){return $value;}else{return '';}}//保存会话数据时调用//会将$_SESSION中的值填充到redis中public function write($id,$data){if($this->redis->set($id,$data)){$this->redis->expire($id,$this->session_expire_time);return TRUE;}else{return FALSE;}}//使用session_destoy()函数时调用public function destroy($id){if($this->redis->delete($id)){return TRUE;}else{return FALSE;}}//垃圾回收函数//会不定时的清理public function gc(){return TRUE;}public function __destruct(){// TODO: Implement __destruct() method.session_write_close();}}?>
3 使用上述类的方法,通过session自带的方法可以使用函数。
new SessionManager();
$_SESSION['username'] = "user";
echo $_SESSION['username'];
session_destroy();
4 测试验证
首先,不使用该类,使用自带的session,
可以在/var/lib/php/session文件夹中可以读取到session文件;
其次,使用redis存储session的方法,打开redis-cli查询,并比较/var/lib/php/session中文件,
可以发现,调用redis方法时,/var/lib/php/session中文件不增加,仅在redis数据库中出现数据。