本文實(shí)例講述了php實(shí)現(xiàn)多站點(diǎn)共用session實(shí)現(xiàn)單點(diǎn)登錄的方法。分享給大家供大家參考,具體如下:
最近閑來(lái)無(wú)事,總結(jié)整理下單點(diǎn)登錄的問(wèn)題。
單點(diǎn)登錄的基本原理為:客戶端共享sesionid,服務(wù)器端共享session信息。通過(guò)共同的sessionid在服務(wù)器端獲得相同session信息,即可達(dá)到單點(diǎn)登錄(即多站點(diǎn)共享用戶信息,一處登錄,處處可用)的目的。
單點(diǎn)登錄分為兩種情況:
一、站點(diǎn)部署在同一個(gè)服務(wù)器,且使用同一個(gè)二級(jí)域名
這種情況下,比較好解決。
1、首先解決站點(diǎn)在客戶端sessionid(存在cookie中)的共享問(wèn)題。使用ini_set()函數(shù)即可指定cookie的域,如下: ini_set('session.cookie_domain', '.xxxx.com');
//設(shè)置服務(wù)器cookie的域,xxxx為公用二級(jí)域名
2、其次解決站點(diǎn)在服務(wù)端的session信息的共享。因?yàn)檎军c(diǎn)在同一個(gè)服務(wù)器,所以生成的session文件是可以公用的,可以直接使用sessionid獲取對(duì)應(yīng)的session信息。
二、站點(diǎn)部署在不同的服務(wù)器,使用不同域名
這種情況比較復(fù)雜,因?yàn)檎军c(diǎn)在不同服務(wù)器使用不同域名,在客戶端不能使用ini_set設(shè)置cookie的作用域,在服務(wù)器端也是各自生成自己的session文件,不能共用,但還是用解決的辦法。
1、首先解決客戶端sessionid同步問(wèn)題。
假設(shè)我們有三個(gè)站點(diǎn),域名分別是aa.com,bb.com,cc.com。我們?cè)赼a.com上建立一個(gè)共用的登陸入口login.php,三個(gè)網(wǎng)站的登陸請(qǐng)求全部跳轉(zhuǎn)到該頁(yè)面。代碼流程如下:
$back = login($name,$pwd);//執(zhí)行登陸操作,成功就寫(xiě)入session
//如果登錄成功,進(jìn)行以下操作流程
if($back){
$sessionid = session_id();
$key = encode($session,$keyword);//生成安全碼
//輸出一個(gè)登陸成功提示頁(yè),并跳轉(zhuǎn)到請(qǐng)求登陸的站點(diǎn)
}
在登陸成功html提示頁(yè)面中添加如下代碼,利用iframe標(biāo)簽請(qǐng)求需要同步登陸的站點(diǎn)

aa.com和cc.com站點(diǎn)的set_cookie.php文件如下
//解密$key
decode($key);
//把當(dāng)前站點(diǎn)的sessionid設(shè)置為傳遞的sessionid
session_id($_GET['sessionid']);
session_start();
2、解決三個(gè)站點(diǎn)服務(wù)器端共享session的問(wèn)題。
前面已經(jīng)說(shuō)過(guò),因?yàn)槿齻€(gè)站點(diǎn)不在同一個(gè)服務(wù)器,因此會(huì)生成各自的session文件,如果想要共享這些文件,又面臨跨域等一系列問(wèn)題。所以我們轉(zhuǎn)化思路,不使用文件保存session信息,而是把session信息保存到數(shù)據(jù)庫(kù)中。這樣,只要獲得session信息的sessionid,任何站點(diǎn)都可以訪問(wèn)相同的session信息。
我們創(chuàng)建一個(gè)mysql_session.php文件,用于存儲(chǔ)session信息到數(shù)據(jù)庫(kù),代碼如下
$gb_DBname="test"; //數(shù)據(jù)庫(kù)名稱(chēng)
$gb_DBuser="root"; //數(shù)據(jù)庫(kù)用戶名稱(chēng)
$gb_DBpass=""; //數(shù)據(jù)庫(kù)密碼
$gb_DBHOSTname="127.0.0.1"; //主機(jī)的名稱(chēng)或是IP地址
$SESS_DBH=""; //數(shù)據(jù)庫(kù)對(duì)象
session_module_name("User"); //定義session存儲(chǔ)按用戶定義的方式
$SESS_LIFE=get_cfg_var("session.gc_maxlifetime");//得到session的最大有效期,也可以自定義
function sess_open($save_path,$session_name)
{
global $gb_DBHOSTname,$gb_DBname,$gb_DBuser,$gb_DBpass,$SESS_DBH;
if(!$SESS_DBH=mysql_pconnect($gb_DBHOSTname,$gb_DBuser,$gb_DBpass)){
echo "MySql Error:".mysql_error()."";
die();
}
if(!mysql_select_db($gb_DBname,$SESS_DBH)){
echo "MySql Error:".mysql_error()."";
die();
}
return true;
}
function sess_close(){
return true;
}
function sess_read($key)
{
global $SESS_DBH,$SESS_LIFE;
$qry="select value from db_session where sesskey = '$key' and expiry > ".time();
$qid=mysql_query($qry,$SESS_DBH);
if(list($value)=mysql_fetch_row($qid)){
return $value;
}
return false;
}
//寫(xiě)入session信息。保存session信息的數(shù)據(jù)表名為:db_session
//除了主鍵自增id,需要的字段如下
//sesskey sessionid
//values session值
//expiry session的到期日期
function sess_write($key,$val)
{
global $SESS_DBH,$SESS_LIFE;
$expiry=time()+$SESS_LIFE;
$value=$val;
$qry="insert into db_session values('$key',$expiry,'$value')";
$qid=mysql_query($qry,$SESS_DBH);
if(!$qid){
$qry="update db_session set expiry=$expiry, value='$value' where sesskey='$key' and expiry >".time();
$qid=mysql_query($qry,$SESS_DBH);
}
return $qid;
}
function sess_destroy($key)
{
global $SESS_DBH;
$qry="delete from db_session where sesskey = '$key'";
$qid=mysql_query($qry,$SESS_DBH);
return $qid;
}
function sess_gc($maxlifetime)
{
global $SESS_DBH;
$qry="delete from db_session where expiry ".time();
$qid=mysql_query($qry,$SESS_DBH);
return mysql_affected_rows($SESS_DBH);
}
session_set_save_handler("sess_open","sess_close","sess_read","sess_write","sess_destroy","sess_gc");
之后在需要使用session的頁(yè)面中,在session_start()之前引入該文件,其他的跟平時(shí)使用seesion一樣就可以了。你會(huì)發(fā)現(xiàn)你賦值的session已經(jīng)被存進(jìn)了數(shù)據(jù)庫(kù)中。
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《PHP中cookie用法總結(jié)》、《php緩存技術(shù)總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》及《php字符串(string)用法總結(jié)》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
您可能感興趣的文章:- php7 list()、session及其他模塊的修改實(shí)例分析
- PHP7創(chuàng)建銷(xiāo)毀session的實(shí)例方法
- PHP 圖像處理與SESSION制作超簡(jiǎn)單驗(yàn)證碼的方法示例
- PHP 實(shí)現(xiàn)超簡(jiǎn)單的SESSION與COOKIE登錄驗(yàn)證功能示例
- PHP cookie與session會(huì)話基本用法實(shí)例分析
- 如何解決PHP獲取不到SESSION信息之一般情況
- thinkphp 5框架實(shí)現(xiàn)登陸,登出及session登陸狀態(tài)檢測(cè)功能示例
- PHP實(shí)現(xiàn)cookie跨域session共享的方法分析
- PHP使用Session實(shí)現(xiàn)上傳進(jìn)度功能詳解
- PHP SESSION跨頁(yè)面?zhèn)鬟f失敗解決方案