当前位置: 移动技术网 > IT编程>开发语言>PHP > php使用MySQL保存session会话的方法

php使用MySQL保存session会话的方法

2018年06月16日  | 移动技术网IT编程  | 我要评论

本文实例讲述了php使用mysql保存session会话的方法。分享给大家供大家参考。具体分析如下:

在很多大的系统中一般都有这个功能,但是要分离出来分析,网上靠谱的资料也不太多 这里我整理了一篇发出来与大家分享

使用mysql保存session会话较files有很多优点:

1) 有利于分布式系统,files只能保存在一台机器上
2) 有利于大访问量的系统,使用files时每个session保存在一个文件中,目录会超级大,查找session文件会比较困难。

//////使用mysql保存会话首先要创建session表:
<?php
$hostname_login = "localhost"; // server address
$username_login = "root"; // user name 
$password_login = ""; // password
//
$data_name = "session"; // database name
$login = mysql_pconnect($hostname_login, $username_login, $password_login) or trigger_error(mysql_error(),e_user_error); 
$sql="show databases like '".$data_name."'"; // if it is exist
if($rs_table=mysql_query($sql,$login)) { 
 if($rs_value=mysql_fetch_array($rs_table)) { 
  echo "数据库已经存在!\n!";
  exit(); 
 } 
}
$sql="create database $data_name";  
mysql_query($sql); // crate database
echo "数据库创建成功!\n"; 
mysql_select_db($data_name, $login);
$sql="create table `sessions` ( 
`sessionkey` varchar(32) not null default '', 
`sessionarray` blob not null, 
`sessionexptime` int(20) unsigned not null default '0', 
primary key (`sessionkey`), 
key `sessionkey` (`sessionkey`) 
) engine=myisam default charset=utf8"; //新建数据库 sql语句
mysql_query($sql);
echo "成功新建数据库表!";
?>
/////////mysqlsession 类如下:
<?php 
class mysqlsession {
// 注意在有使用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;
function mysqlsession (&$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();
}
function sess_open($save_path, $session_name){ // 打开数据库连接
 if (! $this->db_select_db = mysql_pconnect($this->db_server, $this->db_user, $this->db_pass)) { 
 echo "sorry! mysql error : can't connect to $this->db_server as $db_user"; 
 echo "mysql error: ", mysql_error(); 
 die; 
 } 
 if (! mysql_select_db($this->db_name, $this->db_select_db)) { 
 echo "sorry! mysql error : unable to select database $this->db_name"; 
 die; 
 } 
 return true; 
} 
function sess_close() { 
  return true; 
} 
function sess_read($sessionkey){ 
  $query = "select sessionarray from sessions where sessionkey = '".$sessionkey."' and sessionexptime > " . time();
  // 过期不读取。
  $result = mysql_query($query, $this->db_select_db); 
 if (list($sessionarray) = mysql_fetch_row($result)) { 
   return $sessionarray; 
 } 
 return false; 
} 
function sess_write($sessionkey, $varray) { 
 $sessionexptime = time() + $this->sess_life;
 // 更新session过期时间,
 //session过期时间 = 最后一次更新时间 + session的最大使用时长
 $sessionarray = addslashes($varray); 
 $query = "insert into sessions (sessionkey,sessionexptime,sessionarray) values ('".$sessionkey."','".$sessionexptime."','".$sessionarray."')"; 
 $result = mysql_query($query, $this->db_select_db); 
 if (!$result){ 
   $query = "update sessions set sessionexptime = '".$sessionexptime."', sessionarray = '".$sessionarray."' where sessionkey = '".$sessionkey."' and sessionexptime > " . time(); 
   $result = mysql_query($query, $this->db_select_db); 
 } 
 return $result; 
} 
function sess_destroy($sessionkey) { 
 $query = "delete from sessions where sessionkey = '".$sessionkey."'"; 
 $result = mysql_query($query, $this->db_select_db); 
 return $result; 
} 
function sess_gc($maxlifetime) {
// 这个垃圾清除器系统调用。
//默认是1440秒清除一次。参数可以在php.ini里面设置。
 $query = "delete from sessions where sessionexptime < " . time(); 
 $result = mysql_query($query, $this->db_select_db); 
 return mysql_affected_rows($this->db_select_db); 
} 
}
?>
//用法:在原来使用 session_start 的地方,替换成 $session = new mysqlsession () 
//注意:包含此程序前要打开数据库,主程序退出前不能关闭数据库,否则会出错。

希望本文所述对大家的php程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网