网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > PHP > 正文
PHP实现多服务器session共享之mysql共享
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/12/05
下载{$ArticleTitle}原创论文样式

/**
* 类名:  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();

(责任编辑:admin)

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号