Heim  >  Artikel  >  Backend-Entwicklung  >  多服务器共享session(mysql)

多服务器共享session(mysql)

WBOY
WBOYOriginal
2016-05-19 14:04:55850Durchsuche
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        {  
         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`  
     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();  
?>
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn