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


Posted in PHP onJune 18, 2015

本文实例讲述了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程序设计有所帮助。

PHP 相关文章推荐
国内php原创论坛
Oct 09 PHP
php 提速工具eAccelerator 配置参数详解
May 16 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
Jun 24 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
Jun 20 PHP
php实现的返回数据格式化类实例
Sep 22 PHP
php计算两个文件相对路径的方法
Mar 14 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
May 23 PHP
Apache PHP MySql安装配置图文教程
Aug 27 PHP
PHP+iframe图片上传实现即时刷新效果
Nov 18 PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
Jul 20 PHP
php快速导入大量数据的实例方法
Sep 23 PHP
php装饰者模式简单应用案例分析
Oct 23 PHP
php判断表是否存在的方法
Jun 18 #PHP
PHP实现HTTP断点续传的方法
Jun 17 #PHP
PHP实现在线阅读PDF文件的方法
Jun 17 #PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
Jun 17 #PHP
php源码分析之DZX1.5加密解密函数authcode用法
Jun 17 #PHP
php源码分析之DZX1.5随机数函数random用法
Jun 17 #PHP
php正则替换处理HTML页面的方法
Jun 17 #PHP
You might like
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
PHP设计模式之单例模式原理与实现方法分析
2018/04/25 PHP
使一个函数作为另外一个函数的参数来运行的javascript代码
2007/08/13 Javascript
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
js保存当前路径(cookies记录)
2010/12/14 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
2015/11/30 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
DOM 事件的深入浅出(一)
2016/12/05 Javascript
关于javascript获取内联样式与嵌入式样式的实例
2017/06/01 Javascript
vue mixins组件复用的几种方式(小结)
2017/09/06 Javascript
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
在ironpython中利用装饰器执行SQL操作的例子
2015/05/02 Python
详解Python 数据库 (sqlite3)应用
2016/12/07 Python
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
Python-Seaborn热图绘制的实现方法
2019/07/15 Python
Python创建一个元素都为0的列表实例
2019/11/28 Python
keras得到每层的系数方式
2020/06/15 Python
django项目中使用云片网发送短信验证码的实现
2021/01/19 Python
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
信息管理专业学生自荐信格式
2013/09/22 职场文书
幼儿园实习自我鉴定
2013/12/15 职场文书
高中学生干部学习的自我评价
2014/02/21 职场文书
师范生自荐信模板
2014/05/28 职场文书
小学生自我评价100字(15篇)
2014/09/18 职场文书
幼儿园大班教师个人工作总结
2015/02/05 职场文书
2015年三万活动总结
2015/03/25 职场文书
2015年高中班主任工作总结
2015/04/30 职场文书
喋血孤城观后感
2015/06/08 职场文书
歼十出击观后感
2015/06/11 职场文书
小学安全教育主题班会
2015/08/12 职场文书