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 相关文章推荐
dede3.1分页文字采集过滤规则详说(图文教程)续四
Apr 03 PHP
PHP中常用数组处理方法实例分析
Aug 30 PHP
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
Jun 03 PHP
win2003服务器使用WPS的COM组件的一些问题解决方法
Jan 11 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
Jun 13 PHP
php生成数组的使用示例 php全组合算法
Jan 16 PHP
PHP中session变量的销毁
Feb 27 PHP
PHP检查端口是否可以被绑定的方法示例
Aug 09 PHP
php+mysql开发中的经验与常识小结
Mar 25 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 PHP
你真的了解PHP中的引用符号(&)吗
May 12 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下MAIL的另一解决方案
2006/10/09 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
2013/06/13 PHP
php使用curl详细解析及问题汇总
2016/08/11 PHP
永不消失的title提示代码
2007/02/15 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
2016/05/26 Javascript
浅谈js中的三种继承方式及其优缺点
2016/08/10 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
js运动事件函数详解
2016/10/21 Javascript
JSON与JS对象的区别与对比
2017/03/01 Javascript
js实现水平滚动菜单导航
2017/07/21 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
深入理解Node module模块
2018/03/26 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
2018/09/17 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
微信小程序图片左右摆动效果详解
2019/07/13 Javascript
JavaScript设计模式之门面模式原理与实现方法分析
2020/03/09 Javascript
JavaScript 实现自己的安卓手机自动化工具脚本(推荐)
2020/05/13 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
[36:43]NB vs Optic 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
Python实现的视频播放器功能完整示例
2018/02/01 Python
python批量实现Word文件转换为PDF文件
2018/03/15 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
python爬虫 爬取58同城上所有城市的租房信息详解
2019/07/30 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
python使用pymongo与MongoDB基本交互操作示例
2020/04/09 Python
详解如何用HTML5 Canvas API控制图片的缩放变换
2016/03/22 HTML / CSS
Vertbaudet西班牙网上商店:婴儿服装、童装、母婴用品和儿童家具
2019/10/16 全球购物
JD Sports荷兰:英国领先的运动时尚零售商
2020/03/13 全球购物
文秘专业个人求职信
2013/12/22 职场文书
新农村建设标语
2014/06/24 职场文书
2015年医院创卫工作总结
2015/04/22 职场文书
nginx常用命令放入shell脚本详解
2021/03/31 Servers
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python