|
用 PHP + MySQL 实现跨域名 Session 功能(源码) ~ admin
<?
//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'); ?> |