网站主页   操作系统    网络工程    服务器    网页制作    数据库    程序开发    网络安全    办公软件   
讲座日期: 本周六下午1点30分 抢座
讲座地点: 北大青鸟马甸校区
主讲老师: 王老师 金牌讲师
讲座主题: 网络安全
讲座内容: 检测、防御、黑客信息,如何过滤不安全的网站,如何防御黑客的进攻。
订座电话: 010-82011432/33
  您当前位置:主页 > 网络学院 > 程序开发 > PHP教程 >

多服务器共享session(mysql)




PHP代码
<?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();    
?>

上一篇:php在yahoo!的应用  
下一篇:PHP技巧:通过PHP实现DataGrid功能
相关信息:

·PHP安全之数据过滤 ·使用PHP调用TinyURL API的方法
·PHP技巧:通过PHP实现DataGrid功能 ·php在yahoo!的应用
·7种流行PHP集成开发工具(IDE)的比较 ·PHP开发框架的现状和展望
·草根的进化PHP语言PHP语言发展简史 ·为PHP5定做 ZendBox 将明年初发布
·XML基础入门(一) ·PHP新手上路

Copyright © 2002-2015 版权所有
学校地址:北京市海淀区西三旗建材城中路29号北大青鸟
招生热线:010-82011433/32 京公网安备110102004704  京ICP备05043413号 京公网安备110102004704