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程序设计有所帮助。