php跨域session共享,PHP中利用COOKIE与SESSION联合实现SESSION跨域
大家都知道
在一般情況下,一個(gè)網(wǎng)站只有一個(gè)域名,www.demo.com,但是也有些網(wǎng)站架構(gòu)是由多個(gè)子域名組建的.所以就需要SESSION可以跨子域被 訪問到,這樣才可以實(shí)現(xiàn)用戶的跨域登錄.就是說客戶在A下登錄的,同樣B也同時(shí)登錄了,不需要用戶再次登錄,同時(shí)也實(shí)現(xiàn)了參數(shù)的跨域傳遞.當(dāng)然不可跨域的 SESSION本身已經(jīng)可以幫助我們做很多事情了,那么跨域后的SESSION呢.讀到這里是否很激動人心,當(dāng)然你也可能是正在為SESSION跨域而發(fā) 愁而找到這篇文章的,同樣也祝賀你.我們長話斷說了,開始Ioopen的話題:
首先描述下我的思路,COOKIE可以指定域名,也就是說它可以跨域子域,例如:
setcookie(’name’,’Ioopen’,time()+3600*24,’/’,’demo.com’)
,那么a.demo.com,b.demo.com都可以訪問到$_COOKIE['name'],值也均為’Ioopen’.同 理,SESSION ID也可以設(shè)置成這個(gè)域名,那么a.demo.com和b.demo.com都可以得到同一個(gè)SESSION ID,那么我們的目的也就達(dá)到了.因?yàn)橹懒送粋€(gè)SESSION ID就可以訪問到這個(gè)SESSION中的值了.SESSION有多種方式存儲,文件\數(shù)據(jù)庫\內(nèi)存等,我們采用數(shù)據(jù)庫存儲,因?yàn)槿绻?a.demo.com,b.demo.com不在同一臺服務(wù)器上,那么內(nèi)存和文件的存儲方式就很難實(shí)現(xiàn)跨域了,至于到底又沒有方法,Ioopen還沒有試 過.
首先在數(shù)據(jù)庫中創(chuàng)建一張SESSION表:
CREATE TABLE `sessions` (
`sid` varchar(32) NOT NULL default ”,
`expiry` int(20) unsigned NOT NULL default ’0′,
`value` text NOT NULL,
PRIMARY KEY (`sid`),
KEY `expiry` (`expiry`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
然后寫一個(gè)類,這個(gè)類用于讀取\插入\更新\刪除以及垃圾回收SESSION
class session{
private $db;
function __construct($db){
$this->db=$db;
}
public function open($save_path,$session_name){
return true;
}
public function close(){
$this->db=null;
return true;
}
public function read($sid){
$rs=$this->db->query(“select * from sessions where sid=’”.$sid.”‘”);
foreach ($rs as $row){
return $row['value'];
}
return null;
}
public function write($sid,$value){
if(is_null($oldvalue=$this->read($sid))){
//insert
return $this->db->query(”insert into sessions (sid,expiry,value)values(’”.$sid.”‘,’”.time().”‘,’”.$value.”‘)”);
}else{
//update
return $this->db->query(”update sessions set expiry=’”.time().”‘,value=’”.$value.”‘ where sid=’”.$sid.”‘”);
}
}
public function destroy($sid){
return $this->db->query(”delete from sessions where sid=’”.$sid.”‘”);
}
public function gc($max_life_time){
return $this->db->query(’delete from sessions where expiry+’.$max_life_time.’
}
}
Ioopen來解釋下這個(gè)類:
private $db;
類的DATABASE屬性.
function __construct($db)
類的構(gòu)造函數(shù),在聲明類時(shí),可以直接傳遞DB屬性到類中,當(dāng)然如果還不明白可以先GOOGLE一下”PHP 類 construct 方法”;
public function open($save_path,$session_name) //session打開,沒有什么花頭,直接返回TRUE;
public function close() //session關(guān)閉,同理open,但注意要關(guān)閉DB連接;
public function read($sid) //session讀取,傳值SID,在數(shù)據(jù)表中將這個(gè)SID的VALUE作為返回值返回;
public function write($sid,$value)// session的寫入與更新,這個(gè)你會有疑問,為什么set expiry=’”.time().”‘,稍后答案在清空過期
SESSION GC方法中便會揭曉;
public function destroy($sid) //session的銷毀,很簡單,就是把數(shù)據(jù)表中等于這個(gè)SID的數(shù)據(jù)刪除掉;
public function gc($max_life_time) //清空過期session,把超過max_life_time的session都銷毀掉,也就是session的創(chuàng)建時(shí)間加上最大生存時(shí)間小于現(xiàn)在時(shí)間( expiry+’.$max_life_time.’
好我們接著來看更重要的部分:
上面的類中需要一個(gè)數(shù)據(jù)庫鏈接屬性,所以聲明對象的時(shí)候需要這樣:
$session=new session(your db connect adapter);
數(shù)據(jù)庫鏈接Ioopen提供大家一個(gè)PDO的方法,參照使用:
function connect_db($arrPDODB){
$db=new PDO($arrPDODB['db_driver'].’:host=’.$arrPDODB['db_host'].’;dbname=’.$arrPDODB['db_name'],$arrPDODB['db_user'],$arrPDODB['db_password']);
$db->query(”set names ‘utf8′”);
return $db;
}
因此,上面聲明對象部分你可以這樣寫:
$session=new session(connect_db($arrPDODB));
接下來:
//設(shè)置色session id的名字
ini_set(‘session.name’, ‘sid’);
//不使用 GET/POST 變量方式
ini_set(‘session.use_trans_sid’, 0);
//設(shè)置垃圾回收最大生存時(shí)間
ini_set(‘session.gc_maxlifetime’, 3600);
//使用 cookie 保存 session ID 的方式
ini_set(‘session.use_cookies’, 1);
ini_set(‘session.cookie_path’, ‘/’);
//多主機(jī)共享保存 session id 的 cookie,注意此處域名為一級域名
ini_set(‘session.cookie_domain’, ‘*.xxx.com’);
//將 session.save_handler 設(shè)置為 user,而不是默認(rèn)的 files
session_module_name(‘user’);
session_set_save_handler(array($session,’open’),
array($session,’close’),
array($session,’read’),
array($session,’write’),
array($session,’destroy’),
array($session,’gc’));
以上都是SESSION的設(shè)置,不明白的多搜索下手冊,Ioopen喜歡刨根究底這樣的學(xué)習(xí)方式,這樣你可以學(xué)透一個(gè)知識點(diǎn),而不是知道一知半解,就認(rèn)為自己懂了或者會了.
最后,在你需要的地方將SESSION啟動:
session_start();
總結(jié)
以上是生活随笔為你收集整理的php跨域session共享,PHP中利用COOKIE与SESSION联合实现SESSION跨域的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10月份银行定期存款利率全线上涨,3年期
- 下一篇: php java 共享session_P