文档章节

分布式 php实现session共享

mickelfeng
 mickelfeng
发布于 2012/11/13 13:26
字数 725
阅读 72
收藏 1
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */

/**
 * 文件:    MemcacheSession.inc.php
 * 类名:    MemcacheSession Class
 * 功能:    自主实现基于Memcache存储的 Session 功能
 * 描述:    这个类就是实现Session的功能,基本上是通过
 *          设置客户端的Cookie来保存SessionID,
 *          然后把用户的数据保存在服务器端,最后通过
 *          Cookie中的Session Id来确定一个数据是否是用户的,
 *          然后进行相应的数据操作
 *
 *          本方式适合Memcache内存方式存储Session数据的方式,
 *          同时如果构建分布式的Memcache服务器,
 *          能够保存相当多缓存数据,并且适合用户量比较多并发比较大的情况
 *
 * 注意: 本类必须要求PHP安装了Memcache扩展或者必须有Memcache的PHP API
 *

 */

//设定 SESSION 有效时间,单位是 秒
define('SESS_LIFTTIME', 3600);

//定义memcache配置信息
define('MEMCACHE_HOST', '192.168.31.207');
define('MEMCACHE_PORT', '11211');

if (!defined('MemcacheSession'))
{
    define('MemcacheSession',    TRUE);

    class MemacheSession
    {

        // {{{ 类成员属性定义
        static  $mSessSavePath;
        static  $mSessName;
        static  $mMemcacheObj;
        // }}}

        // {{{ 初始化构造函数
        /**
         * 构造函数
         *
         * @param string $login_user    登录用户
         * @param int $login_type       用户类型
         * @param string $login_sess    登录Session值
         * @return Esession
         */
        public function __construct()
        {
            //我的memcache是以php模块的方式编译进去的,可以直接调用
            //如果没有,就请自己包含 Memcache-client.php 文件
            if (!class_exists('Memcache') || !function_exists('memcache_connect'))
            {
                die('Fatal Error:Can not load Memcache extension!');
            }

            if (!emptyempty(self::$mMemcacheObj) && is_object(self::$mMemcacheObj))
            {
                return false;
            }

            self::$mMemcacheObj = new Memcache;

            if (!self::$mMemcacheObj->connect(MEMCACHE_HOST , MEMCACHE_PORT))
            {
                die('Fatal Error: Can not connect to memcache host '. MEMCACHE_HOST .':'. MEMCACHE_PORT);
            }

            return TRUE;
        }
        // }}}

        /** {{{ sessOpen($pSavePath, $name)
         *
         * @param   String  $pSavePath
         * @param   String  $pSessName
         *
         * @return  Bool    TRUE/FALSE
         */
        public function sessOpen($pSavePath = '', $pSessName = '')
        {
            self::$mSessSavePath    = $pSavePath;
            self::$mSessName        = $pSessName;

            return TRUE;
        }
        // }}}

        /** {{{ sessClose()
         *
         * @param   NULL
         *
         * @return  Bool    TRUE/FALSE
         */
        public function sessClose()
        {
            return TRUE;
        }
        // }}}

        /** {{{ sessRead($wSessId)
         *
         * @param   String  $wSessId
         *
         * @return  Bool    TRUE/FALSE
         */
        public function sessRead($wSessId = '')
        {
            $wData = self::$mMemcacheObj->get($wSessId);

            //先读数据,如果没有,就初始化一个
            if (!emptyempty($wData))
            {
                return $wData;
            }
            else
            {
                //初始化一条空记录
                $ret = self::$mMemcacheObj->set($wSessId, '', 0, SESS_LIFTTIME);

                if (TRUE != $ret)
                {
                    die("Fatal Error: Session ID $wSessId init failed!");

                    return FALSE;
                }

                return TRUE;
            }
        }
        // }}}

        /** {{{ sessWrite($wSessId, $wData)
         *
         * @param   String  $wSessId
         * @param   String  $wData
         *
         * @return  Bool    TRUE/FALSE
         */
        public function sessWrite($wSessId = '', $wData = '')
        {
            // $ret = self::$mMemcacheObj->replace($wSessId, $wData, 0, SESS_LIFTTIME);
            $ret = self::$mMemcacheObj->set($wSessId, $wData, 0, SESS_LIFTTIME);

            if (TRUE != $ret)
            {
                die("Fatal Error: SessionID $wSessId Save data failed!");

                return FALSE;
            }  //http://www.sctarena.com

            return TRUE;
        }  

        // }}}

        /** {{{ sessDestroy($wSessId)
         *
         * @param   String  $wSessId
         *
         * @return  Bool    TRUE/FALSE
         */
        public function sessDestroy($wSessId = '')
        {
            self::sessWrite($wSessId);

            return FALSE;
        }
        // }}}

        /** {{{ sessGc()
         *
         * @param   NULL
         *
         * @return  Bool    TRUE/FALSE
         */
        public function sessGc()
        {
            //无需额外回收,memcache有自己的过期回收机制

            return TRUE;
        }
        // }}}

        /** {{{ initSess()
         *
         * @param   NULL
         *
         * @return  Bool    TRUE/FALSE
         */
        public function initSess()
        {
            $domain = '.mydomain.com';

            //不使用 GET/POST 变量方式
            ini_set('session.use_trans_sid',    0);

            //设置垃圾回收最大生存时间
            ini_set('session.gc_maxlifetime',   SESS_LIFTTIME);

            //使用 COOKIE 保存 SESSION ID 的方式
            ini_set('session.use_cookies',      1);
            ini_set('session.cookie_path',      '/');

            //多主机共享保存 SESSION ID 的 COOKIE
            ini_set('session.cookie_domain',    $domain);  //www.sctarena.com

            //将 session.save_handler 设置为 user,而不是默认的 files
            session_module_name('user');

            //定义 SESSION 各项操作所对应的方法名:
            session_set_save_handler(
                array('MemacheSession', 'sessOpen'),   //对应于静态方法 My_Sess::open(),下同。
                array('MemacheSession', 'sessClose'),
                array('MemacheSession', 'sessRead'),
                array('MemacheSession', 'sessWrite'),
                array('MemacheSession', 'sessDestroy'),
                array('MemacheSession', 'sessGc')
            );

            session_start();

            return TRUE;
        }
        // }}}

    }//end class

}//end define


//调用方法

ini_set("session.save_handler","memcache");
ini_set("session.save_path","tcp://192.168.31.207:11211");
$memSess    = new MemacheSession;
$memSess->initSess();

© 著作权归作者所有

共有 人打赏支持
mickelfeng

mickelfeng

粉丝 226
博文 2607
码字总数 566507
作品 0
成都
高级程序员
加载中

评论(1)

Juzhang
Juzhang
求开放
Linux下编译按装memcache分布式环境(

Linux下编译按装memcache分布式环境(笔记) Linux下编译按装memcache分布式环境(笔记) @author 流水孟春 121169238(at)qq.com Memcache用到了libevent这个库用于Socket的处理,所以还需要...

石头哥哥
2013/01/18
0
0
Session分布式共享 = Session + Redis + Nginx

原文:Session分布式共享 = Session + Redis + Nginx 一、Session 1、Session 介绍 我相信,搞Web开发的对Session一定再熟悉不过了,所以我就简单的介绍一下。 Session:在计算机中,尤其是在网...

杰克.陈
2017/12/07
0
0
构建一个高效无单点故障的分布式session服务

本文来自:http://www.cellphp.com/article-read-opensource-32-php-session-distributed-redis.html 自从PHP问世以来,以其简单的语法丰富的函数和扩展风靡WEB开发界。但是其简单的功能也是P...

红薯
2012/01/14
3.8K
3
分布式学习(4) ---- Spring Session + Redis实现分布式Session共享

单个服务器的应用,Tomcat会将Session保存在本机内存中,但一旦涉及到分布式应用,如何实现不同服务器间的Session共享问题呢? 目前比较主流的方式还是基于分布式缓存Memcached、redis实现,...

KKys
2017/02/07
0
0
采用EaglePHP框架解决分布式集群服务器利用MEMCACHE方式共享SESSION数据的问题

一、问题起源 稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网 站,用户系统是统一的,即一套用户名、密码在整个网站的各...

maoxiaojian
2012/09/06
911
2

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 鱼生不值得

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @瘟神灬念:分享新裤子的单曲《没有理想的人不伤心 (Remix版)》: 《没有理想的人不伤心 (Remix版)》- 新裤子 手机党少年们想听歌,请使劲儿戳...

小小编辑
50分钟前
59
7
arts-week10

Algorithm 905. Sort Array By Parity - LeetCode Review Who’s Afraid of the Big Bad Preloader? 一文读懂前端缓存 一个网络请求3个步骤:请求,处理,响应,而前端缓存主要在请求处响应这两步...

yysue
今天
5
0
00.编译OpenJDK-8u40的整个过程

前言 历经2天的折腾总算把OpenJDK给编译成功了,要说为啥搞这个,还得从面试说起,最近出去面试经常被问到JVM的相关东西,总感觉自己以前学的太浅薄,所以回来就打算深入学习,目标把《深入理...

凌晨一点
今天
6
1
python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
7
2
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
197
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部