文档章节

分布式 php实现session共享

mickelfeng
 mickelfeng
发布于 2012/11/13 13:26
字数 725
阅读 71
收藏 1
点赞 0
评论 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

粉丝 227
博文 2555
码字总数 551789
作品 0
成都
高级程序员
加载中

评论(1)

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

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

石头哥哥
2013/01/18
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
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
911
2
memcached 缓存数据库应用实践

1.1 数据库对比 缓存: 将数据存储到内存中,只有当磁盘胜任不了的时候,才会启用缓存    缺点:断电数据丢失(双电),用缓存存储数据的目的只是为了应付大并发的业务。 数据库: mysql(关系...

侯召顺
2017/12/07
0
0
SaltStack实践案例二

五、Memcached配置管理 Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态数据库驱动网...

Hello_Boys
2015/12/13
218
0
分布式memcache

php下操作memcache: 1.连接memcache服务器 $mem=new Memcache; $mem->addServer("192.168.0.1","11211"); 2.增 $mem->set('name','user1'); 3.删 $mem->delete('name'); 4.改 $mem->set('age......

xyh592
2017/07/06
0
0
分布式学习(4) ---- Spring Session + Redis实现分布式Session共享

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

KKys
2017/02/07
0
0
负载均衡集群中的session解决方案

前言 在我们给Web站点使用负载均衡之后,必须面临的一个重要问题就是Session的处理办法,无论是PHP、Python、Ruby还是Java,只要使用服务器保存Session,在做负载均衡时都需要考虑Session的问...

a928154159
2017/09/13
0
0
Memcache缓存服务器(Nginx+php+Memcache+MySQL)

一、MemCache简介: MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从...

何小帅
2017/03/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

zk实战--rpc框架集群化

在看此篇内容时需要浏览下面内容 netty实战--手写rpc框架 前文功能简介以及功能扩充 利用netty来实现一个点对点的rpc调用。客户端和服务端都是靠手写地址进行socket同学的,无法1对多,也无法...

xpbob
13分钟前
7
0
springboot 发送邮件

获取授权码 添加配置 # 账号和密码spring.mail.username=aaa@qq.comspring.mail.password=bbb# 服务器地址spring.mail.host=smtp.qq.comspring.mail.properties.mail.smtp.ssl.en...

阿豪boy
14分钟前
0
0
如何使用GNU Ring?

文章名:如何使用GNU Ring? 作者:冰焰火灵X 1079092922@qq.com 文章许可:CC BY-SA 4.0 ##1. 安装 下载GNU Ring 点击左边选择你的系统版本(这里以 GNU/Linux 为例,我使用的是Mint 18.3)...

ICE冰焰火灵X
17分钟前
1
0
深入理解springMVC

什么是spring MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而...

Java填坑之路
22分钟前
1
0
《射雕英雄传》书摘

1. 我虽是个飘泊江湖的贫家女子,可不是低三下四、不知自爱之人。你如真心爱我,须当敬我重我。我此生决无别念,就是钢刀架颈,也决意跟定了你。将来……将来如有洞房花烛之日,自然……自能...

k91191
33分钟前
0
0
解决:modal中datePicker 选中时,会触发modal的hidden.bs.modal事件

最近项目中发现了一个bug,具体表现为选中模态框上datepicker组件上的日期时,会触发模态框的关闭事件,导致数据编辑无法正常进行。网上搜索了下,解决方法如下: $('.datepicker').on('hid...

Funcy1122
36分钟前
0
0
Redis分布式锁的正确实现方式

前言 分布式锁一般有三种实现方式: 1.数据库乐观锁 2.基于Redis的分布式锁; 3.基于Zookeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis...

大海201506
今天
0
0
ClassNotFoundException: javax.el.ELManager

这个是因为tomcat7中的el-api2.2,有些版本太低,建议升级tomcat到8.0,利用el-api3.0就会解决这个问题。

无语年华
今天
0
0
Jvm堆内存的划分结构和优化,垃圾回收详解(详细解答篇)

在JVM中堆空间划分如下图所示 上图中,刻画了Java程序运行时的堆空间,可以简述成如下2条 1.JVM中堆空间可以分成三个大区,新生代、老年代、永久代 2.新生代可以划分为三个区,Eden区,两个幸...

嘻哈开发者
今天
1
0
CentOS 7.4 设置系统字符编码

1.语言变量LANG在 /etc/locale 文件中。 2.可以通过/ect/profile 来修改LC_TYPE 变量的值 添加如下代码 export LC_ALL="zh_CN.GBK" export LANG="zh_CN.GBK" 到profile文件中,变量的可以修改...

qimh
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部