为什么要进行session共享?
session.save_handler = files
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
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();
www.a.com www.b.com www.c.com
<?php
require ‘./DBSession.php‘;
$_SESSION[‘userinfo‘] = array(
‘name‘ => ‘aaa‘,
);
var_dump($_SESSION[‘userinfo‘]);

原文:http://www.cnblogs.com/jkko123/p/6352057.html