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


Posted in PHP onJune 26, 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中error_reporting()函数的用法(修改PHP屏蔽错误)
Jul 01 PHP
解析php中的escape函数
Jun 29 PHP
PHP中基本HTTP认证技巧分析
Mar 16 PHP
php获取本周星期一具体日期的方法
Apr 20 PHP
PHP中使用curl伪造IP的简单方法
Aug 07 PHP
PHP格式化MYSQL返回float类型的方法
Mar 30 PHP
PHPExcel简单读取excel文件示例
May 26 PHP
Laravel重写用户登录简单示例
Oct 08 PHP
PHP中的密码加密的解决方案总结
Oct 26 PHP
PHP实现数据库的增删查改功能及完整代码
Apr 18 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
May 27 PHP
浅析PHP中json_encode与json_decode的区别
Jul 15 PHP
Linux操作系统安装LAMP环境
Jun 26 #PHP
PHP中Session可能会引起并发问题
Jun 26 #PHP
WAMP环境中扩展oracle函数库(oci)
Jun 26 #PHP
PHP获取当前相对于域名目录的方法
Jun 26 #PHP
php通过获取头信息判断图片类型的方法
Jun 26 #PHP
以文件形式缓存php变量的方法
Jun 26 #PHP
PHP批量去除BOM头代码分享
Jun 26 #PHP
You might like
php 函数使用方法与函数定义方法
2010/05/09 PHP
php实现XSS安全过滤的方法
2015/07/29 PHP
php显示页码分页类的封装
2017/06/08 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
JavaScript写的一个DIV 弹出网页对话框
2009/08/14 Javascript
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
Jquery数独游戏解析(一)-页面布局
2010/11/05 Javascript
jQuery实战之品牌展示列表效果
2011/04/10 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
JavaScript递归操作实例浅析
2016/10/31 Javascript
BootStrap 弹出层代码
2017/02/09 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
2017/09/19 Javascript
详解ES6中的代理模式——Proxy
2018/01/08 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
快速解决vue-cli在ie9+中无效的问题
2018/09/04 Javascript
深入理解JavaScript的值传递和引用传递
2018/10/24 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
[01:13:17]Secret vs NB 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
Python实现的矩阵类实例
2017/08/22 Python
基于Django与ajax之间的json传输方法
2018/05/29 Python
Python 实现取多维数组第n维的前几位
2019/11/26 Python
python批量修改xml属性的实现方式
2020/03/05 Python
最新的小工具和卓越的产品设计:Oh That Tech!
2019/08/07 全球购物
房地产销售员的自我评价分享
2013/12/04 职场文书
小学生勤俭节约演讲稿
2014/08/28 职场文书
四风问题对照检查整改措施思想报告
2014/10/05 职场文书
镇党政领导班子民主生活会思想汇报
2014/10/11 职场文书
2014年移动公司工作总结
2014/12/08 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
应届生们该怎么书写求职信?
2019/07/05 职场文书
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers