重写php session (memcached)解决session 锁的问题


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修改页面的存在。

  1. No comments yet.
(will not be published)

  1. No trackbacks yet.