thinkphp3.2 session存到redis的方法
来源:互联网 发布:永久封的淘宝店能解吗 编辑:程序博客网 时间:2024/06/15 16:17
有两种方法
第一种:通过php.ini配置
在session_start()之前增加如下代码:
ini_set('session.save_handler', 'redis');ini_set('session.save_path', 'tcp://127.0.0.1:6379');
或者修改php.ini这两处为上面的值重启服务即可
第二种:通过session_set_save_handler
函数
根据官方手册session驱动增加下面的驱动文件
<?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("SESSION_REDIS_HOST") ? C("SESSION_REDIS_HOST") : $this->config['host']; $this->config['port'] = C("SESSION_REDIS_POST") ? C("SESSION_REDIS_POST") : $this->config['port']; $this->config['password'] = C("SESSION_REDIS_PSW") ? C("SESSION_REDIS_PSW") : $this->config['password']; $this->config['select'] = C("SESSION_REDIS_SELECT") ? C("SESSION_REDIS_SELECT") : $this->config['select']; $this->config['expire'] = C("SESSION_REDIS_EXPIRE") ? C("SESSION_REDIS_EXPIRE") : $this->config['expire']; $this->config['expire'] = C("SESSION_REDIS_EXPIRE") ? C("SESSION_REDIS_EXPIRE") : $this->config['expire']; $this->config['session_name'] = C('SESSION_PREFIX') ? C('SESSION_PREFIX') : $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; }}
然后修改框架的common\session函数
/** * session管理函数 * @param string|array $name session名称 如果为数组则表示进行session设置 * @param mixed $value session值 * @return mixed */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(// array(&$hander,"open"),// array(&$hander,"close"),// array(&$hander,"read"),// array(&$hander,"write"),// array(&$hander,"destroy"),// array(&$hander,"gc")); //这样使用 session_set_save_handler($hander,true); } // 启动session if(C('SESSION_AUTO_START')) session_start(); }elseif('' === $value){
优劣分析:
配置文件的方式快速简单,但是不够灵活,也无法在刷新页面的时候自动刷新过期时间,驱动方式改的多但是很灵活,可以自由修改各种配置参数,可以自动刷新过期时间
阅读全文