发信人: wongkelly()
整理人: dalasthunder(2002-07-25 05:57:28), 站内信件
|
(源代码及相关说明可到 http://www.jtdxy.net/kelly/dbsession.zip 下载,建议用 EditPlus 语法着色后查看。)
<?
//config 开始
$session_cfg['host']='localhost'; // ← MySQL 服务器的 host
$session_cfg['port']='3306'; // ← MySQL 服务器的端口号,默认为 3306
$session_cfg['user']='session_user'; // ← MySQL 登录用户名
$session_cfg['user_passwd']='12345'; // ← MySQL 登录用户的密码
$session_cfg['db']='sessiondb'; // ← MySQL 中存放session数据的数据库名
$session_cfg['pconnect']=true; // ← 是否使用 持续连接 连接 MySQL,建议设为
// 持续连接
$session_cfg['expires']=20; // ← Session 生存周期,即用户离开本站后
// 多长时间算其已经 timeout
$session_cfg['cookie_name']='SESSION_ID'; // ← Session 所使用的 cookie 名称
$session_cfg['cookie_path']='/'; // ← Session 所使用的 cookie 的路径
$session_cfg['cookie_domain']=''; // ← Session 所使用的 cookie 域名,例如设为
// 'test.com',那么用户在访问任何以
// test.com 结尾的主机时此 Session
// 都有效,如 aa.test.com 、 bb.test.com
//config 结束
//↓假若需要,请在此文件中写 session_onstart() 和 session_onend() 处理函数
require('global.php');
//↓以下是所有函数定义
function session_init(){ //此函数初始化一个 Session ,并调用 session_onstart() 函数
global $session_cfg,$s_link,$HTTP_SERVER_VARS;
$session_id=md5(uniqid(rand()));
//↑生成唯一的 Session ID,并发送 cookie ,使 client 的 cookie 与服务器
// 端 session 数据对应
setcookie($session_cfg['cookie_name'],$session_id,'',$session_cfg['cookie_path'],
$session_cfg['cookie_domain']);
mysql_query("insert into session values('".$session_id."','".$client_ip.
"',now(),now(),'')",$s_link); //初始化数据库中 Session
//↓为方便用户获取 Session ID,将 Session ID、Client IP、开始时间和最后活动时间
// 放入 session 数组
$session['id']=$session_id;
$session['client_ip']=$HTTP_SERVER_VARS['REMOTE_ADDR']; 也放进去
$session['last_active_time']=$session['start_time']=date('Y-m-d H:i:s');
if(function_exists('session_onstart')){ //假若用户定义了session_onstart,那么调用它!
session_onstart();
}
return $session; //返回 session 数组
}
//↓此函数在本程序最后注册为 shutdown function,即在页面执行完后调用,
// 将 Session 数据保存至数据库
function save_data(){
global $session,$s_link,$HTTP_SERVER_VARS;
$session_id=$session['id'];
unset($session['id']); //↙不要的保存前都删掉:)
unset($session['client_ip']);
unset($session['last_active_time']);
unset($session['start_time']);
$sql="update session set client_ip='".$HTTP_SERVER_VARS['REMOTE_ADDR'].
"',session_data='".addslashes(serialize($session)).
"',last_active_time=now() where session_id='".$session_id."'";
//↗将 session 数组 用函数 serialize() 后会将所有数据变成一个string,
// 可用 unserialize() 将其恢复。
mysql_query($sql,$s_link);
}
function unload_session(){ //相当于 session_destroy() ,销毁当前的 Session 数据
global $session,$s_link;
if(function_exists('session_onend')) session_onend();
mysql_query("delete from session where session_id='".$session['id']."'",$s_link);
}
function read_application_data(){ //读取 Application 共享数据
global $s_link;
$tmpstr=mysql_result(mysql_query("select * from application",$s_link),0,0);
$application=unserialize($tmpstr);
return $application;
}
function application_lock(){ //锁定 Application ,准备更新
global $application,$s_link;
mysql_query('lock tables application write',$s_link);
$application=read_application_data(); //重新读取 Application 数据
}
function application_unlock(){ //解锁并更新 Application 数据
global $application,$s_link;
mysql_query("update application set data='".addslashes(serialize($application))."'",$s_link);
mysql_query('unlock tables',$s_link);
}
//以下是主程序
//↓根据 session_cfg 的设定判断用不用 持续连接
$db_connect=$session_cfg['pconnect'] ? 'mysql_pconnect' : 'mysql_connect';
//↓连接数据库
$s_link=@$db_connect($session_cfg['host'].':'.$session_cfg['port'],$session_cfg['user'],
$session_cfg['user_passwd']);
@mysql_select_db($session_cfg['db'],$s_link);
if(@mysql_error()) die('错误:MySQL 数据库连接失败!');
//↓读取 cookie 中 Session ID
$session_id=isset($HTTP_COOKIE_VARS[$session_cfg['cookie_name']]) ?
$HTTP_COOKIE_VARS[$session_cfg['cookie_name']] : '';
//↓调用 session_onend() (假若你在 global.php 中定义了的话)处理 Session 的结束工作
if(function_exists('session_onend')){
$s_sql="select * from session where last_active_time<date_add(now(),interval -".$session_cfg['expires']." minute)";
$s_res=mysql_query($s_sql,$s_link);
if(mysql_num_rows($s_res)!=0){
while($s_row=mysql_fetch_array($s_res)){
$session=unserialize($s_row['session_data']);
$session['id']=$s_row['session_id'];
$session['client_ip']=$s_row['client_ip'];
$session['last_active_time']=$s_row['last_active_time'];
$session['start_time']=$s_row['start_time'];
session_onend();
}
unset($session);
}
}
//↓将超时的 Session 踢出!
mysql_query("delete from session where last_active_time<date_add(now(),interval -".
$session_cfg['expires']." minute)",$s_link);
if($session_id==''){ //怎么?第一次来?初始一个!
$session=session_init();
}else{
$s_res=mysql_query("select * from session where session_id='".$session_id."'");
if(mysql_num_rows($s_res)==0){ //用户已离开超过 session_cfg 中设定的生存周期
$session_is_timeout=true; //注意一下,可通过此变量判断用户是否为timeout!
$session=session_init();
}else{
//↓读取 Session 数据
$s_row=mysql_fetch_array($s_res);
$session=unserialize($s_row['session_data']);
$session['id']=$session_id;
$session['client_ip']=$s_row['client_ip'];
$session['last_active_time']=$s_row['last_active_time'];
$session['start_time']=$s_row['start_time'];
}
}
$application=read_application_data(); //←读取 Application 数据
//↓当本页结束时,执行 save_data() 保存 Session 数据
register_shutdown_function('save_data');
?> |
|