php SESSON共享 (mysql方式)
发布时间:2020-05-25 08:12:49 所属栏目:PHP 来源:互联网
导读:为什么要进行session共享? 因为一些大型网站,通常会有很多服务器,每个服务器运行不同的业务模块,并使用二级域名(或是完全不同的域名),而用户系统是统一的,通过登陆名、密码来登陆各模块。用户数据放
|
为什么要进行session共享? 因为一些大型网站,通常会有很多服务器,每个服务器运行不同的业务模块,并使用二级域名(或是完全不同的域名),而用户系统是统一的,通过登陆名、密码来登陆各模块。用户数据放在指定的数据库中,各模块都可访问。问题是,当用户登陆模块A时,再进入模块B时,模块B无法获取用户在模块A登陆时的session数据,那么用户又要在模块B重新登陆一次。所以就要用到了sesson共享。 php中session默认是保存在文件中的,在php.inisession.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"),"read"),"write"),"destroy"),"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就可以共享的访问其他站设置的会话数据。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
