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 相关文章推荐
mysql 中InnoDB和MyISAM的区别分析小结
Apr 15 PHP
Apache+php+mysql在windows下的安装与配置图解(最新版)
Nov 30 PHP
PHP spl_autoload_register实现自动加载研究
Dec 06 PHP
解析php中获取url与物理路径的总结
Jun 21 PHP
IIS安装Apache伪静态插件的具体操作图文
Jul 01 PHP
PHP防盗链的基本思想 防盗链的设置方法
Sep 25 PHP
PHP实现动态压缩js与css文件的方法
May 02 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
Sep 16 PHP
php实例化一个类的具体方法
Sep 19 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
Dec 30 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
May 29 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
Aug 11 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
Windows下的PHP5.0详解
2006/11/18 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
Symfony2创建基于域名的路由相关示例
2016/11/14 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
PHP连接sftp并下载文件的方法教程
2018/08/26 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
2012/10/11 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
2014/06/15 Javascript
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
JavaScript实现点击文字切换登录窗口的方法
2015/05/11 Javascript
jQuery+AJAX实现无刷新下拉加载更多
2015/07/03 Javascript
bootstrap-table组合表头的实现方法
2017/09/07 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
2018/01/15 Javascript
Vue实现Layui的集成方法步骤
2020/04/10 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
2020/06/02 Javascript
[52:20]DOTA2-DPC中国联赛正赛 SAG vs XGBO3 第一场 3月5日
2021/03/11 DOTA
python抽象基类用法实例分析
2015/06/04 Python
Python聚类算法之基本K均值实例详解
2015/11/20 Python
python实现识别相似图片小结
2016/02/22 Python
Python优化技巧之利用ctypes提高执行速度
2016/09/11 Python
Python断言assert的用法代码解析
2018/02/03 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
python读取与处理netcdf数据方式
2020/02/14 Python
详解Django配置JWT认证方式
2020/05/09 Python
大数据分析用java还是Python
2020/07/06 Python
django中ImageField的使用详解
2020/12/21 Python
美国领先的宠物用品和宠物食品零售商:Petco
2020/10/28 全球购物
护理工作感言
2014/01/16 职场文书
战友聚会主持词
2014/04/02 职场文书
结对共建协议书
2014/08/20 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
高老头读书笔记
2015/06/30 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python
总结一下关于在Java8中使用stream流踩过的一些坑
2021/06/24 Java/Android