php用redis保存session

方法一:

修改php的配置文件

session.save_handler = redis
session.save_path = "tcp://172.16.1.51:6379"//session.save_path = "tcp://172.16.1.51:6379?auth=123123"如果redis配置的密码需要写成这种方式,填写redis的密码

注释php-fpm.d/www.conf里面的两条内容

;php_value[session.save_handler] = files;
php_value[session.save_path]    = /var/lib/php/session

更改完成之后一定要重启php-fpm服务

方法二:

利用SessionHandlerInterface重写,以thinkphp为例:

首先实现接口方法,

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2017 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
namespace Think\Session\Driver;
// use think\Exception;
class Redis implements \SessionHandlerInterface
{
   /** @var \Redis */
   protected $handler = null;
   protected $config  = [
       'host'         => '127.0.0.1', // redis主机
       'port'         => 6379, // redis端口
       'password'     => '', // 密码
       'select'       => 0, // 操作库
       'expire'       => 3600, // 有效期(秒)
       'timeout'      => 0, // 超时时间(秒)
       'persistent'   => true, // 是否长连接
       'session_name' => 'session_', // sessionkey前缀
   ];
   public function __construct($config = [])
   {
       $this->config['host'] = C("REDIS_HOST") ?: $this->config['host'];
       $this->config['port'] = C("REDIS_POST") ? : $this->config['port'];
       $this->config['password'] = C("REDIS_PASSWORD") ?: $this->config['password'];
       $this->config['select'] = C("REDIS_SELECT") ? : $this->config['select'];
       $this->config['expire'] = C("SESSION_EXPIRE") ?: $this->config['expire'];
       $this->config['session_name'] = C('SESSION_NAME') ? : $this->config['session_name'];

   }
   /**
    * 打开Session
    * @access public
    * @param string $savePath
    * @param mixed  $sessName
    * @return bool
    * @throws Exception
    */
   public function open($savePath, $sessName)
   {
       // 检测php环境
       if (!extension_loaded('redis')) {
           // throw new Exception('not support:redis');
           echo 'not support:redis';
       }
       $this->handler = new \Redis;
       // 建立连接
       $func = $this->config['persistent'] ? 'pconnect' : 'connect';
       $this->handler->$func($this->config['host'], $this->config['port'], $this->config['timeout']);
       if ('' != $this->config['password']) {
           $this->handler->auth($this->config['password']);
       }
       if (0 != $this->config['select']) {
           $this->handler->select($this->config['select']);
       }
       // var_dump($this->handler->get('array_category'));
       return true;
   }
   /**
    * 关闭Session
    * @access public
    */
   public function close()
   {
       $this->gc(ini_get('session.gc_maxlifetime'));
       $this->handler->close();
       $this->handler = null;
       return true;
   }
   /**
    * 读取Session
    * @access public
    * @param string $sessID
    * @return string
    */
   public function read($sessID)
   {
       return (string) $this->handler->get($this->config['session_name'] . $sessID);
   }
   /**
    * 写入Session
    * @access public
    * @param string $sessID
    * @param String $sessData
    * @return bool
    */
   public function write($sessID, $sessData)
   {

       if ($this->config['expire'] > 0) {
           return $this->handler->setex($this->config['session_name'] . $sessID, $this->config['expire'], $sessData);
       } else {
           return $this->handler->set($this->config['session_name'] . $sessID, $sessData);
       }
   }
   /**
    * 删除Session
    * @access public
    * @param string $sessID
    * @return bool
    */
   public function destroy($sessID)
   {
       return $this->handler->delete($this->config['session_name'] . $sessID) > 0;
   }
   /**
    * Session 垃圾回收
    * @access public
    * @param string $sessMaxLifeTime
    * @return bool
    */
   public function gc($sessMaxLifeTime)
   {
       return true;
   }
}

然后在\ThinkPHP\Common\functions.php文件中,将session句柄交给redis实例类。

如下代码:session_set_save_handler($hander,true);便是。

function session($name='',$value='') {
   
$prefix   =  C('SESSION_PREFIX');
   
if(is_array($name)) { // session初始化 在session_start 之前调用
       
if(isset($name['prefix'])) C('SESSION_PREFIX',$name['prefix']);
       
if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){
           
session_id($_REQUEST[C('VAR_SESSION_ID')]);
       }
elseif(isset($name['id'])) {
           
session_id($name['id']);
       }
       
if('common' != APP_MODE){ // 其它模式可能不支持
           
ini_set('session.auto_start', 0);
       }
       
if(isset($name['name']))            session_name($name['name']);
       
if(isset($name['path']))            session_save_path($name['path']);
       
if(isset($name['domain']))          ini_set('session.cookie_domain', $name['domain']);
       
if(isset($name['expire']))          ini_set('session.gc_maxlifetime', $name['expire']);ini_set('session.cookie_lifetime', $name['expire']);
       
if(isset($name['use_trans_sid']))   ini_set('session.use_trans_sid', $name['use_trans_sid']?1:0);
       
if(isset($name['use_cookies']))     ini_set('session.use_cookies', $name['use_cookies']?1:0);
       
if(isset($name['cache_limiter']))   session_cache_limiter($name['cache_limiter']);
       
if(isset($name['cache_expire']))    session_cache_expire($name['cache_expire']);
       
if(isset($name['type']))            C('SESSION_TYPE',$name['type']);
       
if(C('SESSION_TYPE')) { // 读取session驱动
           
$type   =   C('SESSION_TYPE');
           
$class  =   strpos($type,'\\')? $type : 'Think\\Session\\Driver\\'. ucwords(strtolower($type));
           
$hander =   new $class();
           
session_set_save_handler($hander,true);
       }
       
// 启动session
       
if(C('SESSION_AUTO_START'))  session_start();
   }
elseif('' === $value){
       
if(''===$name){
           
// 获取全部的session
           
return $prefix ? $_SESSION[$prefix] : $_SESSION;
       }
elseif(0===strpos($name,'[')) { // session 操作
           
if('[pause]'==$name){ // 暂停session
               
session_write_close();
           }
elseif('[start]'==$name){ // 启动session
               
session_start();
           }
elseif('[destroy]'==$name){ // 销毁session
               
$_SESSION =  array();
               
session_unset();
               
session_destroy();
           }
elseif('[regenerate]'==$name){ // 重新生成id
               
session_regenerate_id();
           }
       }
elseif(0===strpos($name,'?')){ // 检查session
           
$name   =  substr($name,1);
           
if(strpos($name,'.')){ // 支持数组
               
list($name1,$name2) =   explode('.',$name);
               
return $prefix?isset($_SESSION[$prefix][$name1][$name2]):isset($_SESSION[$name1][$name2]);
           }
else{
               
return $prefix?isset($_SESSION[$prefix][$name]):isset($_SESSION[$name]);
           }
       }
elseif(is_null($name)){ // 清空session
           
if($prefix) {
               
unset($_SESSION[$prefix]);
           }
else{
               
$_SESSION = array();
           }
       }
elseif($prefix){ // 获取session
           
if(strpos($name,'.')){
               
list($name1,$name2) =   explode('.',$name);
               
return isset($_SESSION[$prefix][$name1][$name2])?$_SESSION[$prefix][$name1][$name2]:null;
           }
else{
               
return isset($_SESSION[$prefix][$name])?$_SESSION[$prefix][$name]:null;
           }
       }
else{
           
if(strpos($name,'.')){
               
list($name1,$name2) =   explode('.',$name);
               
return isset($_SESSION[$name1][$name2])?$_SESSION[$name1][$name2]:null;
           }
else{
               
return isset($_SESSION[$name])?$_SESSION[$name]:null;
           }
       }
   }
elseif(is_null($value)){ // 删除session
       
if(strpos($name,'.')){
           
list($name1,$name2) =   explode('.',$name);
           
if($prefix){
               
unset($_SESSION[$prefix][$name1][$name2]);
           }
else{
               
unset($_SESSION[$name1][$name2]);
           }
       }
else{
           
if($prefix){
               
unset($_SESSION[$prefix][$name]);
           }
else{
               
unset($_SESSION[$name]);
           }
       }
   }
else{ // 设置session
     
if(strpos($name,'.')){
       
list($name1,$name2) =   explode('.',$name);
       
if($prefix){
           
$_SESSION[$prefix][$name1][$name2]   =  $value;
        }
else{
           
$_SESSION[$name1][$name2]  =  $value;
        }
     }
else{
       
if($prefix){
           
$_SESSION[$prefix][$name]   =  $value;
        }
else{
           
$_SESSION[$name]  =  $value;
        }
     }
   }
   
return null;
}


白俊遥博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论