为什么要进行session共享?

因为一些大型网站,通常会有很多服务器,每个服务器运行不同的业务模块,并使用二级域名(或是完全不同的域名),而用户系统是统一的,通过登陆名、密码来登陆各模块。用户数据放在指定的数据库中,各模块都可访问。问题是,当用户登陆模块A时,再进入模块B时,模块B无法获取用户在模块A登陆时的session数据,那么用户又要在模块B重新登陆一次。所以就要用到了sesson共享。
 
php中session默认是保存在文件中的,在php.ini
session.save_handler = files

我们通过下面的函数来自定义session的存储

session_set_save_handler

该函数有七个参数,分别如下:

open(string $savePath, string $sessionName)
自动会话开始或手动调用session_start()后第一个被调用回调函数 close()
write回调函数调用之后调用 read(string $sessionId)
读取会话数据,如果没有则返回空字符串 write(string $sessionId, string $data)
保存会话数据 destroy($sessionId)
删除会话数据 gc($lifetime)
PHP会不时的调用该函数进行垃圾收集, 调用周期由session.gc_probability和session.gc_divisor参数控制。
lifetime参数由session.gc_maxlifetime设置。 create_sid()
创建新的会话id
我们创建数据表来存储session数据
CREATE TABLE `session` (
`sid` varchar(32) NOT NULL DEFAULT '' COMMENT 'session_id',
`expire` int(11) NOT NULL COMMENT '过期时间',
`data` text COMMENT 'session数据',
PRIMARY KEY (`sid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='session表';
<?php
class DBSession {
protected $db = null;
protected $lifeTime = 0;
protected $sessTable = ''; public function __construct($db, $sessTable) {
$this->db = $db;
$this->sessTable = $sessTable;
$this->lifeTime = ini_get('session.gc_maxlifetime'); ini_set('session.save_handler', 'user');
session_set_save_handler(
array($this, "open"),
array($this, "close"),
array($this, "read"),
array($this, "write"),
array($this, "destroy"),
array($this, "gc")
);
register_shutdown_function('session_write_close');
} public function open($savePath, $sessName) {
return true;
} public function close() {
$this->gc($this->lifeTime);
return true;
} public function read($sessId) {
$time = time();
$ret = mysql_query("SELECT `data` FROM `{$this->sessTable}` WHERE `sid`='{$sessId}' AND `expire` > {$time};", $this->db);
if($ret) {
$row = mysql_fetch_assoc($ret);
return $row['data'];
}
return '';
} public function write($sessId, $sessData) {
$expire = time() + $this->lifeTime;
$sessData = mysql_real_escape_string($sessData); $ret = mysql_query("SELECT COUNT(*) AS cnt FROM `{$this->sessTable}` WHERE `sid`='{$sessId}';", $this->db);
$row = mysql_fetch_assoc($ret);
if($row['cnt']) {
$sql = "UPDATE `{$this->sessTable}` SET `data`='{$sessData}', `expire`={$expire} WHERE `sid`='{$sessId}';";
} else {
$sql = "INSERT INTO `{$this->sessTable}` (`sid`,`expire`,`data`) VALUES('{$sessId}',{$expire},'{$sessData}');";
}
mysql_query($sql, $this->db);
if(mysql_affected_rows($this->db)) {
return true;
}
return false;
} public function destroy($sessId) {
mysql_query("DELETE FROM `{$this->sessTable}` WHERE `sid`='{$sessId}';", $this->db);
if(mysql_affected_rows($this->db)) {
return true;
}
return false;
} public function gc($lifeTime) {
$time = time();
mysql_query("DELETE FROM `{$this->sessTable}` WHERE `expire` < {$time};", $this->db);
return mysql_affected_rows($this->db);
}
} $sessDb = mysql_connect('127.0.0.1', 'root', '') or die('connect error');
mysql_select_db('test', $sessDb) or ('select db error');
mysql_query('set names utf8', $sessDb);
new DBSession($sessDb, 'session');
session_start();

我们通过函数session_set_save_handler来自定义会话的存储方式。

我们创建三个虚拟主机分别为
www.a.com
www.b.com
www.c.com
分别在三个虚拟主机下创建index.php,来设置会话数据。
<?php
require './DBSession.php'; $_SESSION['userinfo'] = array(
'name' => 'aaa',
); var_dump($_SESSION['userinfo']);

查看session数据表如下:

可以看到a,b ,c三个站的会话信息全部保存在了session表中了,只要拿到了session_id就可以共享的访问其他站设置的会话数据。

php SESSON共享 (mysql方式)的更多相关文章

  1. windown 下最简单的安装mysql方式

    最近自己的mysql要升级,需要重新安装mysql,官网有提供傻瓜式的安装方式.. 记得下载.msi的格式.这个安装最简单.

  2. 一脸懵逼学习Hive的元数据库Mysql方式安装配置

    1:要想学习Hive必须将Hadoop启动起来,因为Hive本身没有自己的数据管理功能,全是依赖外部系统,包括分析也是依赖MapReduce: 2:七个节点跑HA集群模式的: 第一步:必须先将Zook ...

  3. linux系统中启动mysql方式已经客户端如和连接mysql服务器

    零点间的记录 一.启动方式1.使用linux命令service 启动:service mysqld start2.使用 mysqld 脚本启动:/etc/inint.d/mysqld start3.使 ...

  4. windows的VMWare下NAT共享无线方式上网的配置

    1,本文参看: https://blog.51cto.com/13648313/2095288 VMware安装最新版CentOS7图文教程 https://blog.csdn.net/q215879 ...

  5. QT--以共享的方式发布应用,QT依赖库

    Building Qt as a Shared Library 因为:QT基本上都是采用动态编译的(被安装的OS中的),(如安装包往往都是默认动态编译处理好的动态库),所以我们采用动态连接的方式进行发 ...

  6. 基于Hadoop2.6.5(HA)的Hive1.2.1的MySQL方式配置

    1.Hive配置MySQL Hive只是一个工具,无需配置多台机器,我在CentOS7One机器上配置Hive /usr/local/hive/apache-hive-1.2.1-bin/conf c ...

  7. 1 复习ha相关 + weekend110的hive的元数据库mysql方式安装配置(完全正确配法)(CentOS版本)(包含卸载系统自带的MySQL)

    本博文的主要内容是: .复习HA相关 .MySQL数据库 .先在MySQL数据库中建立hive数据库 .hive的配置 以下是Apache Hadoop HA的总结.分为hdfs HA和yarn HA ...

  8. 局域网下共享 MySQL 数据库连接

    转载自:https://blog.csdn.net/larger5/article/details/96974554 一.前言 在使用公司的一些开发框架,需要特定的 MySQL 版本,还要做一些配置操 ...

  9. php用mysql方式连接数据库出现Deprecated报错

    以上是用php5.5 连接mysql数据库时报的错. 于是我用php5.4 连接正常没有报错. 这与mysql版本无关系,php 5.x版本,如5.2.5.3.5.4.5.5,怕跟不上时代,新的服务器 ...

随机推荐

  1. iOS 基础

    layoutSubviews: layoutSubviews是对sbuviews的重新布局,比如,我们想更新子视图的位置,可以通过调用layoutSubviews方法(不能直接调用) layoutSu ...

  2. KuDu论文解读

    kudu是cloudera在2012开始秘密研发的一款介于hdfs和hbase之间的高速分布式存储数据库.兼具了hbase的实时性.hdfs的高吞吐,以及传统数据库的sql支持.作为一款实时.离线之间 ...

  3. django项目分页

    测试版本 代码: # 测试分页users=[{'name':'alex{}'.format(i),'pwd':'aaa{}'.format(i)}for i in range(1,302)] def ...

  4. Java的this和super总结

    内容: 1.this和super作用 2.继承关系图 1.this和super作用 this和super的作用: this:区分本类中的成员变量和局部变量同名的情况,代指本类 super:区分子类中的 ...

  5. npm WARN react-native-maps@0.14.0 requires a peer of react@>=15.4.0 but none was installed

    install  the  react-native     here comes a  questions :: npm WARN react-native@0.41.2 requires a pe ...

  6. 15. "wm_concat"_数据库中将查询出来的多条记录中的某个字段用","拼接起来

    例子: select wm_concat(roleid) from lbmember where userid = ? 值的形式:1,2,3 下面是把1,2,3转换为1;2;3select repla ...

  7. tomcat的catalina.out日志文件过大

    今天发现一个服务器的/opt目录数据过大,最后发现是tomcat中的catalina.out日志过大引起的 用du命令查看opt下一层的数据文件大小 [root@ccssapportalp opt]# ...

  8. Linux系统之更改默认块大小

    查看操作系统块大小:#tune2fs  -l /dev/sda1 |grep 'Block size'               ( tune2fs  -l  /dev/sda1可以查看更多相关文件 ...

  9. UIButton 点击事件传参数

    #import <objc/runtime.h> UIButton *btn = // create the button objc_setAssociatedObject(btn, &q ...

  10. 求数组中的逆序对的数量----剑指offer36题

    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数: 如数组{7,5,6,4},逆序对总共有5对,{7,5},{7,6},{7, ...