php進(jìn)階(四)之會話機(jī)制

1、設(shè)置cookie

(1)删顶、PHP設(shè)置Cookie最常用的方法就是使用setcookie函數(shù)阎姥,setcookie具有7個可選參數(shù),我們常用到的為前5個:

name( Cookie名)可以通過$_COOKIE['name'] 進(jìn)行訪問
value(Cookie的值)
expire(過期時間)Unix時間戳格式拨扶,默認(rèn)為0凳鬓,表示瀏覽器關(guān)閉即失效
path(有效路徑)如果路徑設(shè)置為'/',則整個網(wǎng)站都有效
domain(有效域)默認(rèn)整個域名都有效患民,如果設(shè)置了'www.imooc.com',則只在www子域中有效

$value = 'test';
setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600);  //有效期一小時
setcookie("TestCookie", $value, time()+3600, "/path/", "imooc.com"); //設(shè)置路徑與域

(2)缩举、PHP中還有一個設(shè)置Cookie的函數(shù)setrawcookie,setrawcookie跟setcookie基本一樣,唯一的不同就是value值不會自動的進(jìn)行urlencode仅孩,因此在需要的時候要手動的進(jìn)行urlencode托猩。

setrawcookie('cookie_name', rawurlencode($value), time()+60*60*24*365); 

(3)、因為Cookie是通過HTTP標(biāo)頭進(jìn)行設(shè)置的辽慕,所以也可以直接使用header方法進(jìn)行設(shè)置京腥。

header("Set-Cookie:cookie_name=value");

2、cookie的刪除與過期時間

在PHP中刪除cookie也是采用setcookie函數(shù)來實現(xiàn)溅蛉。

setcookie('test', '', time()-1); 

可以看到將cookie的過期時間設(shè)置到當(dāng)前時間之前公浪,則該cookie會自動失效,也就達(dá)到了刪除cookie的目的船侧。之所以這么設(shè)計是因為cookie是通過HTTP的標(biāo)頭來傳遞的欠气,客戶端根據(jù)服務(wù)端返回的Set-Cookie段來進(jìn)行cookie的設(shè)置,如果刪除cookie需要使用新的Del-Cookie來實現(xiàn)镜撩,則HTTP頭就會變得復(fù)雜晃琳,實際上僅通過Set-Cookie就可以簡單明了的實現(xiàn)Cookie的設(shè)置、更新與刪除琐鲁。
了解原理以后卫旱,我們也可以直接通過header來刪除cookie。

header("Set-Cookie:test=1393832059; expires=".gmdate('D, d M Y H:i:s \G\M\T', time()-1));

這里用到了gmdate围段,用來生成格林威治標(biāo)準(zhǔn)時間顾翼,以便排除時差的影響。

3奈泪、cookie的有效路徑

cookie中的路徑用來控制設(shè)置的cookie在哪個路徑下有效适贸,默認(rèn)為'/',在所有路徑下都有涝桅,當(dāng)設(shè)定了其他路徑之后拜姿,則只在設(shè)定的路徑以及子路徑下有效,例如:

setcookie('test', time(), 0, '/path');

上面的設(shè)置會使test在/path以及子路徑/path/abc下都有效冯遂,但是在根目錄下就讀取不到test的cookie值蕊肥。

4、session與cookie的異同

cookie將數(shù)據(jù)存儲在客戶端蛤肌,建立起用戶與服務(wù)器之間的聯(lián)系壁却,通常可以解決很多問題裸准,但是cookie仍然具有一些局限:

cookie相對不是太安全展东,容易被盜用導(dǎo)致cookie欺騙
單個cookie的值最大只能存儲4k
每次請求都要進(jìn)行網(wǎng)絡(luò)傳輸,占用帶寬

session是將用戶的會話數(shù)據(jù)存儲在服務(wù)端炒俱,沒有大小限制盐肃,通過一個session_id進(jìn)行用戶識別爪膊,PHP默認(rèn)情況下session id是通過cookie來保存的,因此從某種程度上來說砸王,seesion依賴于cookie推盛。但這不是絕對的,session id也可以通過參數(shù)來實現(xiàn)处硬,只要能將session id傳遞到服務(wù)端進(jìn)行識別的機(jī)制都可以使用session

5小槐、使用session

在PHP中使用session非常簡單拇派,先執(zhí)行session_start方法開啟session荷辕,然后通過全局變量$_SESSION進(jìn)行session的讀寫。

session_start();
$_SESSION['test'] = time();
var_dump($_SESSION);

session會自動的對要設(shè)置的值進(jìn)行encode與decode件豌,因此session可以支持任意數(shù)據(jù)類型疮方,包括數(shù)據(jù)與對象等。

session_start();
$_SESSION['ary'] = array('name' => 'jobs');
$_SESSION['obj'] = new stdClass();
var_dump($_SESSION);

默認(rèn)情況下茧彤,session是以文件形式存儲在服務(wù)器上的骡显,因此當(dāng)一個頁面開啟了session之后,會獨(dú)占這個session文件曾掂,這樣會導(dǎo)致當(dāng)前用戶的其他并發(fā)訪問無法執(zhí)行而等待惫谤。可以采用緩存或者數(shù)據(jù)庫的形式存儲來解決珠洗。

6溜歪、刪除與銷毀session

刪除某個session值可以使用PHP的unset函數(shù),刪除后就會從全局變量$_SESSION中去除许蓖,無法訪問蝴猪。

session_start();
$_SESSION['name'] = 'jobs';
unset($_SESSION['name']);
echo $_SESSION['name']; //提示name不存在

如果要刪除所有的session,可以使用session_destroy函數(shù)銷毀當(dāng)前session膊爪,session_destroy會刪除所有數(shù)據(jù)自阱,但是session_id仍然存在。

session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
session_destroy();

值得注意的是米酬,session_destroy并不會立即的銷毀全局變量_SESSION中的值沛豌,只有當(dāng)下次再訪問的時候,_SESSION才為空赃额,因此如果需要立即銷毀$_SESSION琼懊,可以使用unset函數(shù)。

session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
unset($_SESSION);
session_destroy(); 
var_dump($_SESSION); //此時已為空

如果需要同時銷毀cookie中的session_id爬早,通常在用戶退出的時候可能會用到哼丈,則還需要顯式的調(diào)用setcookie方法刪除session_id的cookie值。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筛严,一起剝皮案震驚了整個濱河市醉旦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖车胡,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件檬输,死亡現(xiàn)場離奇詭異,居然都是意外死亡匈棘,警方通過查閱死者的電腦和手機(jī)丧慈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來主卫,“玉大人逃默,你說我怎么就攤上這事〈亟粒” “怎么了完域?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瘩将。 經(jīng)常有香客問我吟税,道長,這世上最難降的妖魔是什么姿现? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任肠仪,我火速辦了婚禮,結(jié)果婚禮上备典,老公的妹妹穿的比我還像新娘异旧。我一直安慰自己,他們只是感情好熊经,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布泽艘。 她就那樣靜靜地躺著,像睡著了一般镐依。 火紅的嫁衣襯著肌膚如雪匹涮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天槐壳,我揣著相機(jī)與錄音然低,去河邊找鬼。 笑死务唐,一個胖子當(dāng)著我的面吹牛雳攘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枫笛,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吨灭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刑巧?” 一聲冷哼從身側(cè)響起喧兄,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤无畔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吠冤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浑彰,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年拯辙,在試婚紗的時候發(fā)現(xiàn)自己被綠了郭变。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡涯保,死狀恐怖诉濒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情遭赂,我是刑警寧澤循诉,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布横辆,位于F島的核電站撇他,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏狈蚤。R本人自食惡果不足惜困肩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脆侮。 院中可真熱鬧锌畸,春花似錦、人聲如沸靖避。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幻捏。三九已至盆犁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間篡九,已是汗流浹背谐岁。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榛臼,地道東北人伊佃。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像沛善,于是被迫代替她去往敵國和親航揉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 目錄Cookie機(jī)制什么是CookieCookie的不可跨域名性Unicode編碼:保存中文BASE64編碼:保存...
    Tomatoro閱讀 16,942評論 7 186
  • 會話(Session)跟蹤是Web程序中常用的技術(shù)金刁,用來跟蹤用戶的整個會話帅涂。常用的會話跟蹤技術(shù)是Cookie與Se...
    chinariver閱讀 5,617評論 1 49
  • 簡介Cookie是存儲在客戶端瀏覽器中的數(shù)據(jù)织咧,我們通過Cookie來跟蹤與存儲用戶數(shù)據(jù)。一般情況 下漠秋,Cookie...
    蘇宇lovecc閱讀 678評論 0 2
  • 一笙蒙、會話控制(session與cookie) 1.cookie簡介 Cookie是存儲在客戶端瀏覽器中的數(shù)據(jù),我們...
    空谷悠閱讀 625評論 0 5
  • 項目開發(fā)常見流程介紹 需求調(diào)研 項目經(jīng)理------>需求說明書 軟件設(shè)計書 項目經(jīng)理------>...
    _1633_閱讀 1,419評論 1 6