使用MySql保存session

本文来源于:http://www.lai18.com/content/433951.html

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

时间: 2024-10-14 14:20:26

使用MySql保存session的相关文章

PHP利用MySQL保存session

实现环境: PHP 5.4.24 MySQL 5.6.19 OS X 10.9.4/Apache 2.2.26 一.代码 CREATE TABLE `session` ( `skey` char(32) CHARACTER SET ascii NOT NULL, `data` text COLLATE utf8mb4_bin, `expire` int(11) NOT NULL, PRIMARY KEY (`skey`), KEY `index_session_expire` (`expire`

如何使用数据库保存session的方法简介

使用数据库保存session的方法 php的session默认是以文件方式保存在服务器端,并且在客户端使用cookie保存变量,这就会出现一个问题,当一个用户由于某种安全原因关闭了浏览器的cookie,程序中的session相关操作将无法执行.因此,如果能以数据库保存session数据,将不受客户端设置的限制,并且在性能和扩展性等方面有一个飞跃.程序中使用关键函数是session_set_save_handler,同时要将php.ini里的session.save_handler = files

使用SQL Server保存Session状态,实现单点登录

在做一些应用网站时,我们可能会碰到这样一种情况:整个项目是由多个网站组成的,而我们要实现用户从一个站点登录后,跳转到其他网站不需要重复登录,即实现单点登录.目前实现单点登录的技术也有好几种,这篇文章描述一下如何使用ASP.NET2.0和SQL Server来实现单点登录.一般在用户登录成功后,我们需要把用户登录成功的信息保存在Session里,但是Session的值只能保存在用户当前访问的站点下,只要我们实现了Session的跨站共享,也就基本上实现了用户在一个站点登录成功后在其他站点不需要重复

mysql保存当前时间精确到秒

用mybatis在mysql中保存字段精确到秒需要两个步骤. 1.现在mysql中将时间字段改为datetime 例如:alter table tablename add pay_date datetime comment '精确到秒的时间' 2.在sql语句中直接用now().  例如:        update tj_record set   is_customerHandover ='1' and customer_handover_date = now() where id = #{r

夺命雷公狗TP3.2.3商城8-----管理员登录并且保存session

首先我们在D:\phpStudy\WWW\shop\WEB\Admin\Controller  目录下创建LoginController.class.php,登录和注销都是在这个控制器下执行的: 然后我们对她进行编辑: 然后到  D:\phpStudy\WWW\shop\WEB\Admin\View  目录下抽奖login的文件夹,再将我们准备好的模版拉进去即可... 再将里面的样式都改一下即可.完成后如下所示: 然后我们在控制器下接收下post过来的数据在发送给Model 来进行处理,如下所示

用PHP和MySQL保存和输出图片

mysql可以直接保存二进制的数据,数据类型是blob.   通常在数据库中所使用的文本或整数类型的字段和需要用来保存图片的字段的不同之    处就在于两者所需要保存的数据量不同.MySQL数据库使用专门的字段来保存大容量的数据,数据    类型为BLOB.        MySQL数据库为BLOB做出的定义如下:BLOB数据类型是一种大型的二进制对象,可以保存可    变数量的数据.BLOB具有四种类型,分别是TINYBLOB,BLOB,  MEDIUMBLOB  和LONGBLOB,区别在于

mysql保存中文乱码的原因和解决办法

当你遇到这个mysql保存中文乱码问题的时候,期待找到mysql保存中文乱码的原因和解决办法这样一篇能解决问题的文章是多么激动人心. 也许30%的程序员会选择自己百度,结果发现网友已经贴了很多类似mysql 中文乱码.php mysql 中文乱码.mysql5.5中文乱码.mysql 乱码.mysql乱码问题.mysql jsp 乱码.mysql jdbc 乱码.mysql 查询乱码.mysql 导入数据乱码等一系列问题,到底哪个是自己要找的能解决自己问题的呀?15%的程序员一看就懵了,剩下15

mysql 保存emoji时报,数据库报错:Caused by: java.sql.SQLException: Incorrect string value: &#39;\xF0\x9F\x98\x82\xF0\x9F...&#39; for column &#39;review&#39; at row 1

错误原因:我们可以看到错误提示中的字符0xF0 0x9F 0x98 0x84 ,这对应UTF-8编码格式中的4字节编码(UTF-8编码规范).正常的汉字一般不会超过3个字节,为什么为出现4个字节呢?实际上是它对应的是智能手机输入法中的表情.那为什么会报错呢?因为mysql中的utf-8并不是真正意义上的utf-8,它只能存储1~3个字节长度的utf-8编码,如果想存储4个字节的必须用utf8mb4类型.不而要使用utf8mb4类型,首先要保证Mysql版本要不低于 MySQL 5.5.3. 常用

Asp.Net 保存Session的三种方式

一.默认方式,保存在IIS进程中保存在IIS进程中是指把Session数据保存在IIS的运行的进程中,也就是inetinfo.exe这个进程中,这也是默认的Session的存方式,也是最常用的. 这种方式的优点是简单,性能最高.但是当重启IIS服务器时Session丢失. 二.保存在StateServer上这种方式首先要启动Asp.Net State服务 <sessionState mode="StateServer" stateConnectionString="tc