<?php
ini_set("session.save_handler","user");
//session.gc_probability = 1 分子
ini_set("session.gc_probability",1);
//session.gc_divisor = 1000 分母
ini_set("session.gc_divisor",2);
//session.gc_maxlifetime = 1440 垃圾回收时间,session有效期
$maxlifetime = ini_set("session.gc_maxlifetime");
session_set_save_handler( "open","close","read","write","destroy","gc" );
//连接数据库
function open(){
@$link = mysql_connect('127.0.0.1', 'root', 'root');
mysql_query('set names utf8');
mysql_query('use xxx');
}
function close(){
mysql_close();
}
function read($sess_id){
$sql = "select session_data from `session` where session_id = '$sess_id'";
$result = mysql_query($sql);
if($rows = mysql_fetch_assoc($result)){
return $rows['session_data']; }else{
return '';
}
}
function write($sess_id,$sess_data){
$sql = "insert into `session` (session_id,session_data,session_time) values('$sess_id','$sess_data', now())
on duplicate key update session_data = '$sess_data' , session_time = now()
"; //这是为了gc()
return mysql_query($sql);
}
function destroy($sess_id){
echo __FUNCTION__;
$sql = "delete from `session` where session_id = '$sess_id'";
return mysql_query($sql);
}
function gc($sess_id){
echo __FUNCTION__;
$sql = "delete from `session` where now()-session_time > '$maxlifetime' ";
return mysql_query($sql);
}
header("content-type:text/html;charset=utf8");
session_start();
$_SESSION['name']='zhangsan';
//echo session_id();
echo $_SESSION['name'];
?>
一客户端访问一个服务器的时候,建立了一个会话机制,他们验证这个机制就靠的产生会话机制时服务器端发给客户端的一个sessionid , 这仅仅是一串经过加密的字符串,就像我们去理发办了一张会员卡,你来消费就会拿这个卡在电脑上刷一下,读这个卡号一样。也就是说。服务器相同,同一客户端在一定时间范围内访问服务器的会话sessionid是相同的。
比如咱们有个主站叫 www.bytszz.com 这里有个会员登录功能。好了。登录后要实现对另一个站,这里比如他的子站 member.bytszz.com 的同步登录,因为2个站可能放在相同的服务器上,这时他们的PHPSESSID是相同的。可以实现同步登录。但如果是放在不同的服务器上呢?
他们产生的PHPSESSIONID是不同的。按前面说的他们就无法获取相同的2个sessionid。而且域也不一样。这时如果我们依然想实现同步登陆,怎么办?
session的内容是存放在服务器端的。不同的服务器内容不方便共享。所以我们要找一个中介。让两台服务器都可以从这里读取到存放session内容的中介。
这里提供2种思路。一种是存放在一个数据库的表中,还有一种是存放在某个缓存文件中,具体情况具体对待吧。之所以说这2种方法就是要说标题所提到的session_set_save_handle方法。这个方法的使用大家百度一下。我说下他的作用。
咱们 可以采用自己的命名规则,用md5加密一串字符串吧。以自己的字符串为键值放到cookie中去。键名自己取个好了。比如这里就存$_COOKIE['TEXTID'] = 'sdfdasf32edsdfsdaafdssafasdf',这样的东西,然后使用session_set_save_handle方法,连接到数据库的一个表中。用这个 'sdfdasf32edsdfsdaafdssafasdf' 作为一个sesskey,将我们要存的session内容存到一个data字段中。加上一些需要的字段比如IP呀,有效时间呀待。在另一个不同服务器的网 站采用相同的命名规则。因为要生成相同的sesskey,所以命名规则不要设计到服务器的信息。这样。2个服务器生成的TEXTID是相同的。通过此函数 可以读取数据表中的sesskey。返回data。达到session共享。这样就可以不同服务器同步登录了。存在文件中的方法也是这个原理。