PHP实现多服务器session共享之mysql共享-阿里云开发者社区

开发者社区> 科技小先锋> 正文

PHP实现多服务器session共享之mysql共享

简介:
+关注继续查看
基于mysql的实现方式代码如下:
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
//===========================================
// 程序:   mysql-Based Session Class
// 功能:   基于mysql存储的 Session 功能类
// 作者:    yejr
// 网站:    http://imysql.cn
// 时间:    2007-01-05
//===========================================
/**
 * 类名:    MySQL Session Class
 * 功能:    自主实现基于MySQL HEAP表存储的 Session 功能
 * 描述:    这个类就是实现Session的功能,基本上是通过设置客户端的Cookie来保存SessionID,
 *          然后把用户的数据保存在服务器端,最后通过Cookie中的Session Id来确定一个数据是否是用户的,
 *          然后进行相应的数据操作
 *
 * 注意: 本类调用了PEAR::DB类,如果有自己的DB类,则可以稍微修改一下代码
 *
 * 备注:数据表初始化SQL语句:
 * CREATE TABLE `sessions` (
 * `sid` varchar(32) NOT NULL default '',
 * `session` longtext,
 * `flush_dt` int unsigned NOT NULL default '0',
 * PRIMARY KEY  (`sid`),
 * KEY `last` (`flush_dt`)
 * ) ENGINE=HEAP;
 */
//设定 SESSION 有效时间,单位是 秒
define('SESS_LIFTTIME', 3600);
define('DB_DSN', 'mysql://root:@localhost/test');
define('DB_NAME','test');
require_once('DB.php');
$gDb    = new DB;
$gDb    = DB::connect(DB_DSN, TRUE);
if (PEAR::isError($gDb))
{
    die($gDb->getMessage());
}
if (!defined('MySQLSession'))
{
    define('MySQLSession',    TRUE);
class Usess
{
    static  $mSessSavePath;
    static  $mSessName;
    static  $mSessMaxTime;
    static  $mTblSess   = 'sessions';
    static  $mTblSessMap;
    static  $mDb;
    // {{{ 初始化构造函数
    /**
     * 构造函数
     *
     * @param string $login_user    登录用户
     * @param int $login_type       用户类型
     * @param string $login_sess    登录Session值
     * @return Esession
     */
    public function __construct()
    {
        self::$mSessMaxTime = SESS_LIFTTIME;
        self::$mTblSessMap  = array(
                'sid'   => 'sid',
                'data'  => 'session',
                'last'  => 'flush_dt',
                );
    }
    // }}}
    /** {{{ sessOpen($pSavePath, $name)
     *
     * @param   String  $pSavePath
     * @param   String  $pSessName
     *
     * @return  Bool    TRUE/FALSE
     */
    public function sessOpen($pSavePath = '', $pSessName = '')
    {
        global $gDb;
        self::$mDb  = $gDb;
        self::$mSessSavePath    = $pSavePath;
        self::$mSessName        = $pSessName;
        self::sessGc();
        return TRUE;
    }
    // }}}
    /** {{{ sessClose()
     *
     * @param   NULL
     *
     * @return  Bool    TRUE/FALSE
     */
    public function sessClose()
    {
        return TRUE;
    }
    // }}}
    /** {{{ sessRead($wSid)
     *
     * @param   String  $wSid
     *
     * @return  Bool    TRUE/FALSE
     */
    public function sessRead($wSid = '')
    {
        global $db;
        $wSql    = sprintf("SELECT * FROM `%s`.`%s` WHERE `%s` = '%s';",
                        DB_NAME,
                        self::$mTblSess,
                        self::$mTblSessMap['sid'],
                        $wSid
                );
        //这里一定要用 DB_FETCHMODE_ASSOC,否则取回的数组只能用数字做下标
        if (!PEAR::isError($row = self::$mDb->getRow($wSql, null, DB_FETCHMODE_ASSOC)))
        {
            //session已经存在了
            if (is_array($row) && 1 <= count($row))
            {
                return $row[self::$mTblSessMap['data']];
            }
            else
            {
                $wSql    = sprintf("INSERT INTO `%s`.`%s` VALUES ('%s', '', UNIX_TIMESTAMP(NOW()));",
                                DB_NAME,
                                self::$mTblSess,
                                $wSid
                        );
                if (!PEAR::isError(self::$mDb->query($wSql)))
                {
                    return TRUE;
                }
            }
        }
        return FALSE;
    }
    // }}}
    /** {{{ sessWrite($wSid, $wData)
     *
     * @param   String  $wSid
     * @param   String  $wData
     *
     * @return  Bool    TRUE/FALSE
     */
    public function sessWrite($wSid = '', $wData = '')
    {
        $wData  = mysql_escape_string($wData);
        $wSql    = sprintf("UPDATE `%s`.`%s` SET `%s` = '%s', `%s` = UNIX_TIMESTAMP(NOW()) WHERE `%s` = '%s';",
                        DB_NAME,
                        self::$mTblSess,
                        self::$mTblSessMap['data'],
                        $wData,
                        self::$mTblSessMap['last'],
                        self::$mTblSessMap['sid'],
                        $wSid
                );
        if (!PEAR::isError(self::$mDb->query($wSql)))
        {
            return TRUE;
        }
        return FALSE;
    }
    // }}}
    /** {{{ sessDestroy($wSid)
     *
     * @param   String  $wSid
     *
     * @return  Bool    TRUE/FALSE
     */
    public function sessDestroy($wSid = '')
    {
        $wSql    = sprintf("DELETE FROM `%s`.`%s` WHERE `%s` = '%s';",
                        DB_NAME,
                        self::$mTblSess,
                        $wSid
                );
        if (!PEAR::isError(self::$mDb->query($wSql)))
        {
            return TRUE;
        }
        return FALSE;
    }
    // }}}
    /** {{{ sessGc()
     *
     * @param   NULL
     *
     * @return  Bool    TRUE/FALSE
     */
    public function sessGc()
    {
        global $db;
        //计算出过期时间
        $last   = time() - self::$mSessMaxTime;
        $wSql    = sprintf("DELETE FROM `%s`.`%s` WHERE `%s` < $last;", DB_NAME, self::$mTblSess, self::$mTblSessMap['last']);
        if (!PEAR::isError(self::$mDb->query($wSql)))
        {
            return TRUE;
        }
        return FALSE;
    }
    // }}}
    /** {{{ initSess()
     *
     * @param   NULL
     *
     * @return  Bool    TRUE/FALSE
     */
    public function initSess()
    {
        $domain = '';
        //不使用 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);
        //将 session.save_handler 设置为 user,而不是默认的 files
        session_module_name('user');
        //定义 SESSION 各项操作所对应的方法名:
        session_set_save_handler(
                array('Usess', 'sessOpen'),   //对应于静态方法 My_Sess::open(),下同。
                array('Usess', 'sessClose'),
                array('Usess', 'sessRead'),
                array('Usess', 'sessWrite'),
                array('Usess', 'sessDestroy'),
                array('Usess', 'sessGc')
                );
        session_start();
        return TRUE;
    }
    // }}}
}//end class
}//end define
$sess   = new Usess;
$sess->initSess();
?>
以上代码在 php5.20 中测试通过。


本文转自叶金荣51CTO博客,原文链接:http://blog.51cto.com/imysql/310479,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SpringBoot开发案例之分布式集群共享Session
前言 在分布式系统中,为了提升系统性能,通常会对单体项目进行拆分,分解成多个基于功能的微服务,如果有条件,可能还会对单个微服务进行水平扩展,保证服务高可用。 那么问题来了,如果使用传统管理 Session 的方式,我们会遇到什么样的问题? 案例 这里拿下单举例,用户小明在天猫上相中了一个的娃娃,觉得不错,果断购买,选尺寸,挑身高,然后确认选择,赶紧提交订单,然后就跳转到了登录页面!小明表示很郁闷,大写的问号??? 小明进入娃娃页面,此时请求通过代理服务发送到业务系统一。
1047 0
Nginx如何实现负载均衡以及Session共享教程详解
最近迷上了Nginx,真实麻雀虽小,五脏俱全..功能实在强大.. nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态、静态页面的分离,可以按照轮询、ip哈希、URL哈希、权重等多种方式对后端服务器做负载均衡,同时还支持后端服务器的健康检查。
1320 0
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 29 章 监控磁盘使用_29.2. 磁盘满失败
29.2. 磁盘满失败 一个数据库管理员最重要的磁盘监控任务就是确保磁盘不会写满。一个写满了的数据磁盘可能不会导致数据的崩溃,但它肯定会让系统变得不可用。如果保存 WAL 文件的磁盘变满,会发生数据库服务器致命错误并且可能发生关闭。
1092 0
tomcat的session不共享
最近被strtus2的远程执行命令漏洞深深伤害了一次,其危害程度到直接可以关闭服务器、删除服务器上任意文件,临时恢复业务的方案是重新弄了一次tomcat集群,但是发现session不共享了,半夜调试了一次发现是组播坑了我。
747 0
《圣殿祭司的ASP.NET4.0专家技术手册》---- 1-16 IIS 7.5 Express精简版网页服务器
如果你的操作系统(如Windows XP)的IIS不是最新版IIS 7.5,但正式的网页服务器又是执行IIS 7.5功能,故用IIS 5或IIS 6可能某些功能测不到。这时可通过Web Platform Installer【安装Web组件】安装IIS 7.
1348 0
centos搭建nginx+php+mysql环境(高于apeche10的服务器)
示意流程图: 官方中文wiki站:http://wiki.nginx.org/Chs 比较好的资源站点:www.s135.com 张宴的个人博客很牛逼 Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
765 0
6967
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载