发信人: 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');
 
 ?> | 
 
 
 |