工作中经常遇到,多台机器登录的问题, 这里的解决方案就是保存到memcache,或者redis中。
<?php
class Session implements SessionHandlerInterface
{
private static $lifetime = null;//session周期
private static $domain = null;//当前域名
private static function init()
{
self::$lifetime = ini_get('session.gc_maxlifetime') ? ini_get('session.gc_maxlifetime') : 1800;
self::$domain = 'xxxx';
}
public static function start()
{
self::init();
//多主机共享保存 SESSION ID 的 COOKIE,
// ini_set('session.cookie_domain', self::$_domain);
//将 session.save_handler 设置为 redis,而不是默认的 files
session_module_name('redis');
$obj = new Com_Session();
session_set_save_handler(
array(&$obj, 'open'),
array(&$obj, 'close'),
array(&$obj, 'read'),
array(&$obj, 'write'),
array(&$obj, 'destroy'),
array(&$obj, 'gc'));
// 下面这行代码可以防止使用对象作为会话保存管理器时可能引发的非预期行为
register_shutdown_function('session_write_close');
session_start();
}
public function open($savePath, $sessionName)
{
return true;
}
public function close()
{
return true;
}
public function read($sessionId)
{
if (!$sessionId) return '';
//重redis获取值
$res = Libs_Cache_Redis::get($sessionId);
return $res ? unserialize($res) : '';
}
public function write($sessionId, $data)
{
if (!$sessionId) return '';
//自定义的设置redis方法
$res = Libs_Cache_Redis::set($sessionId, serialize($data), self::$lifetime);
return $res ? $res : '';
}
public function destroy($sessionId)
{
if (!$sessionId) return '';
//这里是自定义Redis类的删除
$res = Libs_Cache_Redis::delete($sessionId);
return $res ? $res : '';
}
public function gc($maxlifetime)
{
return true;
}
}
网友评论