日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

php跨域session共享,PHP中利用COOKIE与SESSION联合实现SESSION跨域

發(fā)布時(shí)間:2023/12/10 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php跨域session共享,PHP中利用COOKIE与SESSION联合实现SESSION跨域 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大家都知道

在一般情況下,一個(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。