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

   2015-06-23 0
核心提示:这篇文章主要介绍了php使用MySQL保存session会话的方法,实例分析了php操作MySQL数据库及session对话的相关技巧,需要的朋友可以参考下

本文实例讲述了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` ( 
`Session
Key` varchar(32) NOT NULL default '', 
`SessionArray` blob NOT NULL, 
`SessionExpTime` int(20) unsigned NOT NULL default '0', 
PRIMARY KEY (`Session
Key`), 
KEY `Session
Key` (`Session
Key`) 
) 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($Session
Key){ 
  $Query = "SELECT SessionArray FROM sessions WHERE Session
Key = '".$Session
Key."' 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($Session
Key, $VArray) { 
 $SessionExpTime = time() + $this->SESS_LIFE;
 // 更新Session过期时间,
 //Session过期时间 = 最后一次更新时间 + Session的最大使用时长
 $SessionArray = addslashes($VArray); 
 $Query = "INSERT INTO sessions (Session
Key,SessionExpTime,SessionArray) VALUES ('".$Session
Key."','".$SessionExpTime."','".$SessionArray."')"; 
 $Result = mysql_query($Query, $this->DB_SELECT_DB); 
 if (!$Result){ 
   $Query = "UPDATE sessions SET SessionExpTime = '".$SessionExpTime."', SessionArray = '".$SessionArray."' WHERE Session
Key = '".$Session
Key."' AND SessionExpTime > " . time(); 
   $Result = mysql_query($Query, $this->DB_SELECT_DB); 
 } 
 return $Result; 
} 
function sess_destroy($Session
Key) { 
 $Query = "DELETE FROM sessions WHERE Session
Key = '".$Session
Key."'"; 
 $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 session
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • php-fpm进程管理的三种模式 phpfpm子进程
    php-fpm进程管理的三种模式 phpfpm子进程
    php-fpm解读-进程管理的三种模式—程序媛大丽标明转载以示尊重 感谢原作者的分享。php-fpm进程管理一共有三种模式:ondemand、static、dynamic,我们可以在同一个fpm的master配置三种模式,看下图1。php-fpm的工作模式和nginx类似,都是一个master,多个worke
    03-08
  • nginx和php-fpm 是使用 tcp socket 还是 unix s
    tcp socket允许通过网络进程之间的通信,也可以通过loopback进行本地进程之间通信。unix socket允许在本地运行的进程之间进行通信。分析从上面的图片可以看,unix socket减少了不必要的tcp开销,而tcp需要经过loopback,还要申请临时端口和tcp相关资源。但是
    03-08
  • [PHP8] 我参加了PHP8工程师认证初学者考试beta考试
    [PHP8] 我参加了PHP8工程师认证初学者考试beta
    前几天,2022/08/05,PHP工程师认证机构PHP8 技术员认证初级考试宣布实施考试将于 2023 年春季开始。和 beta 测试完成于 2022/09/11所以我收到了。一般社团法人BOSS-CON JAPAN(代表理事:Tadashi Yoshimasa,地点:东京都世田谷区,以下简称“BOSS-CON JAPAN
    03-08
  • 将 PHP Insights 放入旧版 PJ 不是很好吗?谈论
    将 PHP Insights 放入旧版 PJ 不是很好吗?谈论
    介绍在最近的PHP系统开发中,感觉故事在理所当然包含静态分析工具的前提下进行。我的周围现有代码很脏,我很久以前安装了工具,但几乎没有检查已经观察到许多这样的案例。 (这是小说。而不是像 0 或 100 这样不允许单行错误的静态分析,一点一点,逐渐我想介
    03-08
  • PHP基于elasticsearch全文搜索引擎的开发 php使
    1.概述:全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接
    02-09
  • php视图操作
    一、视图的基本介绍         视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。        使用视图需要MySQL5及以后的版本支持。        下面是视图的一些常见应用:        重用SQL语句;        简化复杂的S
    02-09
  • php中图像处理的常用函数 php图形图像处理技术
    php中图像处理的常用函数 php图形图像处理技术
    1.imagecreate()函数imagecreate()函数是基于一个调色板的画布。?php $im = imagecreate(200,80);                //创建一个宽200,高80的画布。$white = imagecolorallocate($im,225,35,180);     //设置画布的背景颜色imagegif($im);
    02-09
  • PHP安全之webshell和后门检测
    PHP安全之webshell和后门检测
    基于PHP的应用面临着各种各样的攻击:XSS:对PHP的Web应用而言,跨站脚本是一个易受攻击的点。攻击者可以利用它盗取用户信息。你可以配置Apache,或是写更安全的PHP代码(验证所有用户输入)来防范XSS攻击SQL注入:这是PHP应用中,数据库层的易受攻击点。防范
    02-09
  • php使用时间戳保存时间的意义 PHP获取时间戳
    时间戳记录的是格林尼治时间,使用date格式化的时候会根据你程序设置的不同时区显示不同的时间。如果使用具体时间,则还需要进行多一步转换。
    02-09
  • PHP 获取提交表单数据方法
    PHP $_GET 和 $_POST变量是用来获取表单中的信息的,比如用户输入的信息。PHP表单操作在我们处理HTML表单和PHP表单时,我们要记住的重要一点是:HTML页面中的任何一个表单元素都可以自动的用于PHP脚本:表单举例: htmlbodyform action="welcome.php" method
    02-09
点击排行