将session信息写入到memcache中管理

最近在学习高级会话:

一、学习了用cookie模拟用户登录注册退出流程,信息写入$_COOKIE数组,依赖于客户端浏览器,安全性也低

二、又学习了session模拟用户登录注册退出流程,信息写入$_SESSION数组,保存在服务器端。

但是基于session技术:又有多种方式,

1)基于cookie的,让客户端浏览器用cookie方式记住session_id,实现

2)基于url的,让地址栏上每一刻都记录着session_id,(可以用变量记住,也可以用SID,也是多种方式),即客户浏览器禁用cookie的情况下。

三、再有就是session服务器端的管理

主要就是围绕这个扩展在动 session.save_handler = files/user/memcache

1)保存到文件,可以是系统默认的方式,不用改配置文件任何地方。也可以是自定义的(上面改成user),重写session.save_handler(其中又包含6个方法)

2)保存到数据库中。上面的配置改成user,重写session.save_handler(其中又包含6个方法)

3)保存到memcache中,这种是最快最优的保存方式,同上,配置改成user,重写session.save_handler(其中又包含6个方法)

保存到memcache这种情况,也可以用系统自带的,需要改配置:

session.save_handler = memcache

session.save_path = "tcp://localhost:11211"  ;这个地方写成这样就是直接写入memcache数据库,多个服务器,用逗号隔开

然后,这种情况就不用重写session.save_handler了。

上面的这三种方式,本博客里,都有实现,可以看看相关内容。

 

这篇是将session信息保存到memcache中,session.save_handler = user 的情况。 初学者,问题可能还有很多,多多指出。

 

<?php

/***
将信息写入到Memcache中管理
***/

class MemSession {
    private static $handler = null;  //数据库连接
    private static $lifetime = null; //垃圾回收时间
    private static $time = null;     //当前时间
    const NS ='session_';            //

    //初始化,给变量附上值
    private static function init($handler){
        self::$handler = $handler;
        self::$lifetime = ini_get('session.gc_maxlifetime'); 
        
        self::$time=time();
    }

    public static function start(Memcache $memcache){
        self::init($memcache);

        session_set_save_handler(      //回调函数
            array(__CLASS__,'open'),   //调用本类的open方法  
            array(__CLASS__,'close'),
            array(__CLASS__,'read'),
            array(__CLASS__,'write'),
            array(__CLASS__,'destroy'),
            array(__CLASS__,'gc')
        );

        session_start();
    }
    
    public static function open($path,$name){
        return true;
    }

    public static function close(){
        return true;
    }

    //从memcache中读取
    public static function read($PHPSESSID){
        $out=self::$handler->get(self::session_key($PHPSESSID));

        if($out === false || $out == null)
            return '';

        return $out;
    }

    //写入memcache中
    public static function write($PHPSESSID,$data){
        $method =$data?'set':'replace';

       return self::$handler->$method(self::session_key($PHPSESSID),$data,MEMCACHE_COMPRESSED,self::$lifetime);
    }

    public static function destroy($PHPSESSID){
        return self::$handler->delete(self::session_key($PHPSESSID));
    }

    public static function gc($lifetime){
        return true;
    }

    //拼凑session_id,在前面加上前缀
    public static function session_key($PHPSESSID){
        $session_key = self::NS.$PHPSESSID ; //设置session键

        return $session_key;
    }
    

}


$memcache = new Memcache();

//连接mem数据库
$memcache->connect('localhost',11211) or exit("could not connect!");

//开启服务
MemSession::start($memcache);





?>


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值