php使用MySQL保存session会话的方法
本文实例讲述了php使用MySQL保存session会话的方法。分享给大家供大家参考。具体分析如下:
在很多大的系统中一般都有这个功能,但是要分离出来分析,网上的资料也不太多这里我整理了一篇发出来与大家分享
使用MySQL保存session会话较files有很多优点:
1)有利于分布式系统,files只能保存在一台机器上
2)有利于大访问量的系统,使用files时每个session保存在一个文件中,目录会超级大,查找session文件会比较困难。
使用MySQL保存会话首先要创建session表:
<?php
$hostname_login="localhost";//Serveraddress
$username_login="root";//Username
$password_login="";//Password
//
$data_name="session";//Databasename
$login=mysql_pconnect($hostname_login,$username_login,$password_login)ortrigger_error(mysql_error(),E_USER_ERROR);
$sql="SHOWDATABASESLIKE'".$data_name."'";//Ifitisexist
if($rs_table=mysql_query($sql,$login)){
if($rs_value=mysql_fetch_array($rs_table)){
echo"数据库已经存在!\n!";
exit();
}
}
$sql="CREATEDATABASE$data_name";
mysql_query($sql);//Cratedatabase
echo"数据库创建成功!\n";
mysql_select_db($data_name,$login);
$sql="CREATETABLE`sessions`(
`SessionKey`varchar(32)NOTNULLdefault'',
`SessionArray`blobNOTNULL,
`SessionExpTime`int(20)unsignedNOTNULLdefault'0',
PRIMARYKEY(`SessionKey`),
KEY`SessionKey`(`SessionKey`)
)ENGINE=MyISAMDEFAULTCHARSET=utf8";//新建数据库sql语句
mysql_query($sql);
echo"成功新建数据库表!";
?>
MysqlSession类如下:
<?php
classMysqlSession{
//注意在有使用Session的页面。页面一定要顶格,页面开始处不能留空。
private$DB_SERVER="localhost";//数据库服务器主机名
private$DB_NAME="";//数据库名字
private$DB_USER="root";//MYSQL数据库访问用户名
private$DB_PASS="";//MYSQL数据库访问密码
private$DB_SELECT_DB="";
//private$SESS_LIFE=1440;//Session的最大使用时长,单位秒。
private$SESS_LIFE=0;
functionMysqlSession(&$sessionDB){
//session_write_close();
$this->DB_NAME=&$sessionDB;
$this->SESS_LIFE=get_cfg_var("session.gc_maxlifetime");
session_module_name('user');
session_set_save_handler(
array(&$this,'sess_open'),
array(&$this,'sess_close'),
array(&$this,'sess_read'),
array(&$this,'sess_write'),
array(&$this,'sess_destroy'),
array(&$this,'sess_gc')
);
session_start();
}
functionsess_open($save_path,$session_name){//打开数据库连接
if(!$this->DB_SELECT_DB=mysql_pconnect($this->DB_SERVER,$this->DB_USER,$this->DB_PASS)){
echo"SORRY!MYSQLERROR:Can'tconnectto$this->DB_SERVERas$DB_USER";
echo"MySQLError:",mysql_error();
die;
}
if(!mysql_select_db($this->DB_NAME,$this->DB_SELECT_DB)){
echo"SORRY!MYSQLERROR:Unabletoselectdatabase$this->DB_NAME";
die;
}
returntrue;
}
functionsess_close(){
returntrue;
}
functionsess_read($SessionKey){
$Query="SELECTSessionArrayFROMsessionsWHERESessionKey='".$SessionKey."'ANDSessionExpTime>".time();
//过期不读取。
$Result=mysql_query($Query,$this->DB_SELECT_DB);
if(list($SessionArray)=mysql_fetch_row($Result)){
return$SessionArray;
}
returnfalse;
}
functionsess_write($SessionKey,$VArray){
$SessionExpTime=time()+$this->SESS_LIFE;
//更新Session过期时间,Session过期时间=最后一次更新时间+Session的最大使用时长
$SessionArray=addslashes($VArray);
$Query="INSERTINTOsessions(SessionKey,SessionExpTime,SessionArray)VALUES('".$SessionKey."','".$SessionExpTime."','".$SessionArray."')";
$Result=mysql_query($Query,$this->DB_SELECT_DB);
if(!$Result){
$Query="UPDATEsessionsSETSessionExpTime='".$SessionExpTime."',SessionArray='".$SessionArray."'WHERESessionKey='".$SessionKey."'ANDSessionExpTime>".time();
$Result=mysql_query($Query,$this->DB_SELECT_DB);
}
return$Result;
}
functionsess_destroy($SessionKey){
$Query="DELETEFROMsessionsWHERESessionKey='".$SessionKey."'";
$Result=mysql_query($Query,$this->DB_SELECT_DB);
return$Result;
}
functionsess_gc($maxlifetime){
//这个垃圾清除器系统调用。默认是1440秒清除一次。
//参数可以在PHP.ini里面设置。
$Query="DELETEFROMsessionsWHERESessionExpTime<".time();
$Result=mysql_query($Query,$this->DB_SELECT_DB);
returnmysql_affected_rows($this->DB_SELECT_DB);
}
}
?>
用法:在原来使用session_start的地方,替换成$session=newMysqlSession()
注意:包含此程序前要打开数据库,主程序退出前不能关闭数据库,否则会出错。
希望本文所述对大家的php程序设计有所帮助。