有兩種方法
第一種:通過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 <[email protected]>
// +----------------------------------------------------------------------
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){
優劣分析:
配置文件的方式快速簡單,但是不夠靈活,也無法在刷新頁面的時候自動刷新過期時間,驅動方式改的多但是很靈活,可以自由修改各種配置參數,可以自動刷新過期時間