Processing math: 100%

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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
No entry or manifest in @ali/alfa-aliyundotcom-free-widget-goods-card
Error: No entry or manifest in @ali/alfa-aliyundotcom-free-widget-goods-card
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:578343
    at h (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:379364)
    at Generator.<anonymous> (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:380687)
    at Generator.next (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:379774)
    at Pe (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:491844)
    at a (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:492048)
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:492109
    at new Promise (<anonymous>)
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:491988
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:578533
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
No entry or manifest in @ali/alfa-aliyundotcom-free-widget-goods-card
Error: No entry or manifest in @ali/alfa-aliyundotcom-free-widget-goods-card
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:578343
    at h (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:379364)
    at Generator.<anonymous> (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:380687)
    at Generator.next (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:379774)
    at Pe (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:491844)
    at a (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:492048)
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:492109
    at new Promise (<anonymous>)
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:491988
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:578533
云数据库 RDS MySQL,高可用系列 2核4GB
No entry or manifest in @ali/alfa-aliyundotcom-free-widget-goods-card
Error: No entry or manifest in @ali/alfa-aliyundotcom-free-widget-goods-card
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:578343
    at h (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:379364)
    at Generator.<anonymous> (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:380687)
    at Generator.next (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:379774)
    at Pe (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:491844)
    at a (https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:492048)
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:492109
    at new Promise (<anonymous>)
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:491988
    at https://g.alicdn.com/aliyun/developer-aliyun-com-fe/2.8.51/scripts/articleDetail.js:1:578533
简介:
基于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,如需转载请自行联系原作者
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
69
分享
相关文章
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
51 28
源码编译安装LAMP(HTTP服务,MYSQL ,PHP,以及bbs论坛)
通过以上步骤,你可以成功地在一台Linux服务器上从源码编译并安装LAMP环境,并配置一个BBS论坛(Discuz!)。这些步骤涵盖了从安装依赖、下载源代码、配置编译到安装完成的所有细节。每个命令的解释确保了过程的透明度,使即使是非专业人士也能够理解整个流程。
49 18
【YashanDB知识库】YMP从mysql迁移到崖山,报错:服务器错误
【YashanDB知识库】YMP从mysql迁移到崖山,报错:服务器错误
【YashanDB知识库】YMP从mysql迁移到崖山,报错:服务器错误
【YashanDB知识库】YMP从mysql迁移到崖山,报错:服务器错误
【YashanDB知识库】YMP从mysql迁移到崖山,报错:服务器错误
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
176 25
服务器数据恢复—云服务器上mysql数据库数据恢复案例
某ECS网站服务器,linux操作系统+mysql数据库。mysql数据库采用innodb作为默认存储引擎。 在执行数据库版本更新测试时,操作人员误误将在本来应该在测试库执行的sql脚本在生产库上执行,导致生产库上部分表被truncate,还有部分表中少量数据被delete。
92 25
当你的nginx服务器和php服务器不在一起的时候,这个nginx 的root目录问题
两个服务器的网站代码目录需要对齐,docker容器里面也是一样
如何解决 MySQL 数据库服务器 CPU 飙升的情况
大家好,我是 V 哥。当 MySQL 数据库服务器 CPU 飙升时,如何快速定位和解决问题至关重要。本文整理了一套实用的排查和优化套路,包括使用系统监控工具、分析慢查询日志、优化 SQL 查询、调整 MySQL 配置参数、优化数据库架构及检查硬件资源等步骤。通过一个电商业务系统的案例,详细展示了从问题发现到解决的全过程,帮助你有效降低 CPU 使用率,提升系统性能。关注 V 哥,掌握更多技术干货。
267 0
MySQL/SqlServer跨服务器增删改查(CRUD)的一种方法
通过上述方法,MySQL和SQL Server均能够实现跨服务器的增删改查操作。MySQL通过联邦存储引擎提供了直接的跨服务器表访问,而SQL Server通过链接服务器和分布式查询实现了灵活的跨服务器数据操作。这些技术为分布式数据库管理提供了强大的支持,能够满足复杂的数据操作需求。
196 12
PHP与MySQL的高效交互:从基础到实践####
本文深入探讨了PHP与MySQL数据库之间的高效交互技术,涵盖了从基础连接到高级查询优化的全过程。不同于传统的摘要概述,这里我们直接以一段精简代码示例作为引子,展示如何在PHP中实现与MySQL的快速连接与简单查询,随后文章将围绕这一核心,逐步展开详细讲解,旨在为读者提供一个从入门到精通的实战指南。 ```php <?php // 数据库配置信息 servername="localhost";username = "root"; password="password";dbname = "test_db"; // 创建连接 conn=newmysqli(se
131 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等