使用mysql保存session,并建立在线用户列表
作者 : admin 于 2008年08月15日, 23:02:21
2008
08-15
08-15
写OA,使用mysql存储session,这样,是为了获得在线用户的列表,为做一个web im做准备。
首先创建表,注,这里使用了adodb中数据字典的描述方法:
- $Session_Fields = "
- session_id VARCHAR(100) NOTNULL,
- session_value X DEFAULT '',
- session_expires I(10) DEFAULT NULL,
- userid I(5) DEFAULT NULL
- ";
- $Session_Tables = array('mysql' => "ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci COMMENT = 'session表'");
- $dict = NewDataDictionary(GetDB());
- $sqlarray = $dict->CreateTableSQL($_CFG['table']['session'], $Session_Fields, $Session_Tables);
- $dict->ExecuteSQLArray($sqlarray);
然后session类:
- <?php
- /* Session.Class.php
- * Session Manager
- * @link http://www.sunboyu.cn
- * @package OA
- * @version V1.0
- *
- * 2008 08 14 sunboyu@gmail.com
- */
- class Session
- {
- var $lifetime;
- var $db = null;
- function __construct()
- {
- #return adodb lite connetction
- $this->db = GetDB();
- }
- #open
- function open( $savepath , $session_name )
- {
- $this->lifetime = get_cfg_var("session.gc_maxlifetime");
- return true;
- }
- #close
- function close()
- {
- return true;
- }
- #read
- function read( $session_id )
- {
- global $_CFG;
- $sql = sprintf("SELECT * FROM %s WHERE session_id = %s",$_CFG['table']['session'],GetSqlString( $session_id ));
- $rs = $this->db->Execute( $sql );
- if($rs->RecordCount()>0)
- {
- $result = $rs->fields;
- return $result['session_value'];
- }
- else
- {
- return null;
- }
- }
- #write
- function write( $session_id , $session_value )
- {
- global $_CFG;
- $sql = sprintf("SELECT session_id FROM %s WHERE session_id = %s",$_CFG['table']['session'],GetSqlString( $session_id ));
- $rs = $this->db->Execute( $sql );
- if($rs->RecordCount()==0)
- {
- $newsql = sprintf("INSERT INTO %s SET session_id = %s , session_value = %s , session_expires = %d",
- $_CFG['table']['session'],
- GetSqlString( $session_id ),
- GetSqlString( $session_value ),
- GetSqlString( $this->lifetime+time() , "int" ));
- }
- else
- {
- $newsql = sprintf("UPDATE %s SET session_value = %s , session_expires = %d WHERE session_id = %s",
- $_CFG['table']['session'],
- GetSqlString( $session_value ),
- GetSqlString( $this->lifetime+time() , "int" ),
- GetSqlString( $session_id ));
- }
- return $this->db->Execute( $newsql );
- }
- #destroy
- function destroy( $session_id )
- {
- global $_CFG;
- $delsql = sprintf("DELETE FROM %s WHERE session_id = %s",$_CFG['table']['session'],GetSqlString( $session_id ));
- return $this->db->Execute( $delsql );
- }
- #gc
- function gc()
- {
- global $_CFG;
- $gcsql = sprintf("DELETE FROM %s WHERE session_expires < %d",$_CFG['table']['session'],time());
- return $this->db->Execute( $gcsql );
- }
- }
- ?>
session机制,之前已经介绍,实现代码如下
- $session = new Session();
- session_set_save_handler(array(&$session,"open"),
- array(&$session,"close"),
- array(&$session,"read"),
- array(&$session,"write"),
- array(&$session,"destroy"),
- array(&$session,"gc"));
- session_start();
把session与用户id对应,使用以下语句即可
- sprintf("UPDATE %s SET userid = %d WHERE session_id = %s",$_CFG['table']['session'],GetSqlString($rs['id'],'int'),GetSqlString(session_id(),'text'))