class SessionMemd {
private static $_sess;
private static $cas;
public static $maxlife = 3600;
private function __construct() {}
public static function open($save_path) {
self::$_sess = new Memcached();
$servers = explode(",",$save_path);
foreach($servers as &$v) {
if (preg_match('/[^:]*):(\d{4,5})/',$v,$match)) {
self::$_sess->addServer($match[1],$match[2]);
}
}
self::$_sess->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
self::$_sess->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);
return true;
}
public static function close() {
return true;
}
public static function read($id) {
return self::$_sess->get('sess_'.$id);
}
public static function write($id, $sess_data) {
return self::$_sess->set('sess_'.$id,$sess_data,self::$maxlife);
}
public static function destroy($id) {
return self::$_sess->delete('sess_'.$id);
}
public static function gc() {
return true;
}
}
SessionMemd::$maxlife = ini_get("session.gc_maxlifetime");
session_set_save_handler(array("SessionMemd","open"),array("SessionMemd","close"),array("SessionMemd","read"),array("SessionMemd","write"),array("SessionMemd","destroy"),array("SessionMemd","gc"));
register_shutdown_function ('session_write_close'); //必须调用这个,否则write_close函数不会被执行。。
include上面这个文件,并session_start() 即可rewrite 加锁的memcached session
这个函数有个问题,就是没有考虑session同斥共斥的问题,如果2个页面,一个快,一个慢,同时进行,慢的那个session修改会rewrite掉快的那个,不过这个比较少见!这种session使用的时候,特别是在写入session的时候,最好确认没有其他并行的session修改页面的存在。
Recent Comments