文档章节

分布式 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();

© 著作权归作者所有

共有 人打赏支持
上一篇: js 级联菜单
mickelfeng

mickelfeng

粉丝 231
博文 2690
码字总数 572923
作品 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
采用EaglePHP框架解决分布式集群服务器利用MEMCACHE方式共享SESSION数据的问题

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

maoxiaojian
2012/09/06
1K
2
构建一个高效无单点故障的分布式session服务

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

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

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

KKys
2017/02/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL自增属性auto_increment_increment和auto_increment_offset

MySQL的系统变量或会话变量auto_increment_increment(自增步长)和auto_increment_offset(自增偏移量)控制着数据表的自增列ID。 mysql> show tables;Empty set (0.00 sec)mysql> CREATE TA......

野雪球
16分钟前
0
0
OSChina 周三乱弹 —— 有一天考拉麻麻拉肚子了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @瘟神灬念 :分享周汇洋的单曲《Man Srae(曼斯拉之舞)》:美滋滋。。。。 手机党少年们想听歌,请使劲儿戳(这里) 我听了一下 赶紧关了, ...

小小编辑
今天
81
5
oh-my-zsh 自定义

GitHub 地址 基于 oh-my-zsh 的自定义配置,增加了一些个人常用插件与皮肤。 采用的是 git submodule 来维护,包括 oh-my-zsh,之所以这么搞,主要是手头有多台 linux 需要维护, 每台机器、...

郁也风
今天
7
0
Docker安装踩坑:E_FAIL 0x80004005的解决

参考 菜鸟教程--Windows Docker 安装 http://www.runoob.com/docker/windows-docker-install.html 官方文档-Install Docker Toolbox on Windows https://docs.docker.com/toolbox/toolbox_in......

karma123
今天
6
0
js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部