前言

首先说一下,原版session实际并不是很烂,如果你的项目不是高并发项目,完全可以使用原版session。

PHP默认的session是以文件形式保存在本地磁盘上的,每次访问实际就是一次io操作,并发大时必定会影响服务器速度。

使用cookie代替session,这个我也不太建议,首先cookie是保存在客户端上的,很容易被篡改,如果使用加密确保cookie的完整性,那么cookie保存的数据就会变得越多,就越容易消耗带宽。

而使用内存代替文件储存session就成为现在的主流。

使用Redis替代文件存储Session

session_set_save_handler 该函数定义用户级session保存函数(如打开、关闭、写入等)。

编写一个session管理类sessionManager.php ,代码如下:

<?php
class SessionManager{
 private $redis;
 private $sessionSavePath;
 private $sessionName;
 private $sessionExpireTime=30;//redis,session的过期时间为30s
 public function __construct(){
 $this->redis = new Redis();//创建phpredis实例
 $this->redis->connect('127.0.0.1',6379);//连接redis
 $this->redis->auth("107lab");//授权
 $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);//获取redis中的指定记录
 if($value){
  return $value;
 }else{
  return '';
 }
 }
 public function write($id,$data){
 if($this->redis->set($id,$data)){//以session ID为键,存储
  $this->redis->expire($id,$this->sessionExpireTime);//设置redis中数据的过期时间,即session的过期时间
  return true;
 }
 return false;
 }
 public function destroy($id){
 if($this->redis->delete($id)){//删除redis中的指定记录
  return true;
 }
 return false;
 }
 public function gc($maxlifetime){
 return true;
 }
 public function __destruct(){
 session_write_close();
 }
}

使用时,只需包含SessionManager类,然后实例化一个SessionManager对象。下面建立个session_set.php文件。

<?php
 include('SessionManager.php');
 new SessionManager();
 $_SESSION['username'] = 'captain';

然后再创建一个session_get.php文件,输入如下代码:

<?php
 include('SessionManager.php');
 new SessionManager();
 echo $_SESSION['username'];
//print captain

  

 

posted on 2017-04-26 10:55  peiyu1988  阅读(487)  评论(0编辑  收藏  举报