1.7 PHP之cookie

  1. 簡(jiǎn)介
    Cookie是存儲(chǔ)在客戶端瀏覽器中的數(shù)據(jù)喷斋,我們通過Cookie來跟蹤與存儲(chǔ)用戶數(shù)據(jù)。一般情況 下,Cookie通過HTTP headers從服務(wù)端返回到客戶端损姜。多數(shù)web程序都支持Cookie的操作,因?yàn)镃ookie是存在于HTTP的表頭之中殊霞,所以必須在其他信息輸出之前進(jìn)行設(shè)置摧阅,類似于header函數(shù)的使用限制。
    PHP通過 setcookie 函數(shù)進(jìn)行Cookie的設(shè)置绷蹲,任何從瀏覽器發(fā)回的Cookie棒卷,PHP都會(huì)自動(dòng)的將他存儲(chǔ)在 $_COOKIE 的全局變量之中,因此我們可以通過$_COOKIE['key']的形式來讀取某個(gè)Cookie值祝钢。
    PHP中的Cookie具有非常廣泛的使用比规,經(jīng)常用來存儲(chǔ)用戶的登錄信息,購物車等拦英,且在使用會(huì)話Session時(shí)通常使用Cookie來存儲(chǔ)會(huì)話id來識(shí)別用戶蜒什,Cookie具備有效期,當(dāng)有效期結(jié)束之后龄章,Cookie會(huì)自動(dòng)的從客戶端刪除吃谣。同時(shí)為了進(jìn)行安全控制乞封,Cookie還可以設(shè)置域跟路徑。

  2. 設(shè)置cookie
    PHP設(shè)置Cookie最常用的方法就是使用 setcookie 函數(shù)岗憋,setcookie具有7個(gè)可選參數(shù)肃晚,我們常用到的為前5個(gè):

  • name( Cookie名)可以通過$_COOKIE['name'] 進(jìn)行訪問
  • value(Cookie的值)
  • expire(過期時(shí)間)Unix時(shí)間戳格式,默認(rèn)為0仔戈,表示瀏覽器關(guān)閉即失效
  • path(有效路徑)如果路徑設(shè)置為'/'关串,則整個(gè)網(wǎng)站都有效
  • domain(有效域)默認(rèn)整個(gè)域名都有效,如果設(shè)置了'www.imooc.com',則只在www子域中有效
$value = 'test';
setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600);  //有效期一小時(shí)
setcookie("TestCookie", $value, time()+3600, "/path/", "imooc.com"); //設(shè)置路徑與域

PHP中還有一個(gè)設(shè)置Cookie的函數(shù) setrawcookie 监徘,setrawcookie跟setcookie基本一樣晋修,唯一的不同就是value值不會(huì)自動(dòng)的進(jìn)行urlencode,因此在需要的時(shí)候要手動(dòng)的進(jìn)行urlencode凰盔。

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

因?yàn)镃ookie是通過HTTP標(biāo)頭進(jìn)行設(shè)置的墓卦,所以也可以直接使用header方法進(jìn)行設(shè)置。

header("Set-Cookie:cookie_name=value");
  1. cookie的刪除和過期時(shí)間
    php中沒有刪除Cookie的函數(shù)户敬,在PHP中刪除cookie也是采用setcookie函數(shù)來實(shí)現(xiàn)落剪。
setcookie('test', '', time()-1); 

可以看到將cookie的過期時(shí)間設(shè)置到當(dāng)前時(shí)間之前,則該cookie會(huì)自動(dòng)失效尿庐,也就達(dá)到了刪除cookie的目的忠怖。之所以這么設(shè)計(jì)是因?yàn)?cookie是通過HTTP的標(biāo)頭來傳遞的,客戶端根據(jù)服務(wù)端返回的Set-Cookie段來進(jìn)行cookie的設(shè)置抄瑟,如果刪除cookie需要使用新的 Del-Cookie來實(shí)現(xiàn)凡泣,則HTTP頭就會(huì)變得復(fù)雜,實(shí)際上僅通過Set-Cookie就可以簡(jiǎn)單明了的實(shí)現(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)時(shí)間席舍,以便排除時(shí)差的影響布轿。

  1. cookie的有效路徑
    cookie中的路徑用來控制設(shè)置的cookie在哪個(gè)路徑下有效,默認(rèn)為'/'来颤,在所有路徑下都有汰扭,當(dāng)設(shè)定了其他路徑之后,則只在設(shè)定的路徑以及子路徑下有效福铅,例如:
setcookie('test', time(), 0, '/path');
上面的設(shè)置會(huì)使test在/path以及子路徑/path/abc下都有效萝毛,但是在根目錄下就讀取不到test的cookie值。
一般情況下滑黔,大多是使用所有路徑的笆包,只有在極少數(shù)有特殊需求的時(shí)候环揽,會(huì)設(shè)置路徑,這種情況下只在指定的路徑中才會(huì)傳遞cookie值庵佣,可以節(jié)省數(shù)據(jù)的傳輸歉胶,增強(qiáng)安全性以及提高性能。
當(dāng)我們?cè)O(shè)置了有效路徑的時(shí)候巴粪,不在當(dāng)前路徑的時(shí)候則看不到當(dāng)前cookie通今。
setcookie('test', '1',0, '/path');  
var_dump($_COOKIE['test']);  
  1. cookie 與 session 的異同
    cookie將數(shù)據(jù)存儲(chǔ)在客戶端,建立起用戶與服務(wù)器之間的聯(lián)系肛根,通潮杷可以解決很多問題,但是cookie仍然具有一些局限:
    • cookie相對(duì)不是太安全派哲,容易被盜用導(dǎo)致cookie欺騙
    • 單個(gè)cookie的值最大只能存儲(chǔ)4k
    • 每次請(qǐng)求都要進(jìn)行網(wǎng)絡(luò)傳輸臼氨,占用帶寬

session是將用戶的會(huì)話數(shù)據(jù)存儲(chǔ)在服務(wù)端,沒有大小限制芭届,通過一個(gè)session_id進(jìn)行用戶識(shí)別一也,PHP默認(rèn)情況下session id是通過cookie來保存的,因此從某種程度上來說喉脖,seesion依賴于cookie椰苟。但這不是絕對(duì)的,session id也可以通過參數(shù)來實(shí)現(xiàn)树叽,只要能將session id傳遞到服務(wù)端進(jìn)行識(shí)別的機(jī)制都可以使用session舆蝴。

<?php
//開始使用session
session_start();
//設(shè)置一個(gè)session
$_SESSION['test'] = time();
//顯示當(dāng)前的session_id
echo "session_id:".session_id();
echo "<br>";
//讀取session值
echo $_SESSION['test'];
//銷毀一個(gè)session
unset($_SESSION['test']);
echo "<br>";
var_dump($_SESSION);
  1. 使用session
    在PHP中使用session非常簡(jiǎn)單,先執(zhí)行 session_start 方法開啟session题诵,然后通過全局變量 $_SESSION 進(jìn)行session的讀寫洁仗。
session_start();
$_SESSION['test'] = time();
var_dump($_SESSION);
session會(huì)自動(dòng)的對(duì)要設(shè)置的值進(jìn)行encode與decode,因此session可以支持任意數(shù)據(jù)類型性锭,包括數(shù)據(jù)與對(duì)象等赠潦。
session_start();
$_SESSION['ary'] = array('name' => 'jobs');
$_SESSION['obj'] = new stdClass();
var_dump($_SESSION);
默認(rèn)情況下,session是以文件形式存儲(chǔ)在服務(wù)器上的草冈,因此當(dāng)一個(gè)頁面開啟了session之后她奥,會(huì)獨(dú)占這個(gè)session文件,這樣會(huì)導(dǎo)致當(dāng)前用戶的其他并發(fā)訪問無法執(zhí)行而等待怎棱×螅可以采用緩存或者數(shù)據(jù)庫的形式存儲(chǔ)來解決這個(gè)問題,這個(gè)我們會(huì)在一些高級(jí)的課程中講到拳恋。
  1. 刪除和銷毀session
    刪除某個(gè)session值可以使用PHP的unset函數(shù)凡资,刪除后就會(huì)從全局變量$_SESSION中去除,無法訪問谬运。
session_start();
$_SESSION['name'] = 'jobs';
unset($_SESSION['name']);
echo $_SESSION['name']; //提示name不存在
如果要?jiǎng)h除所有的session隙赁,可以使用session_destroy函數(shù)銷毀當(dāng)前session垦藏,session_destroy會(huì)刪除所有數(shù)據(jù),但是session_id仍然存在伞访。
session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
session_destroy();
 值得注意的是膝藕,session_destroy并不會(huì)立即的銷毀全局變量$_SESSION中的值,只有當(dāng)下次再訪問的時(shí)候咐扭,$_SESSION才為空芭挽,因此如果需要立即銷毀$_SESSION,可以使用unset函數(shù)蝗肪。
session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
unset($_SESSION);
session_destroy(); 
var_dump($_SESSION); //此時(shí)已為空
如果需要同時(shí)銷毀cookie中的session_id袜爪,通常在用戶退出的時(shí)候可能會(huì)用到,則還需要顯式的調(diào)用setcookie方法刪除session_id的cookie值薛闪。
  1. 使用session來存儲(chǔ)用戶登錄信息
    session可以用來存儲(chǔ)多種類型的數(shù)據(jù)辛馆,因此具有很多的用途,常用來存儲(chǔ)用戶的登錄信息豁延,購物車數(shù)據(jù)昙篙,或者一些臨時(shí)使用的暫存數(shù)據(jù)等。
    用戶在登錄成功以后诱咏,通程桑可以將用戶的信息存儲(chǔ)在session中,一般的會(huì)單獨(dú)的將一些重要的字段單獨(dú)存儲(chǔ)袋狞,然后所有的用戶信息獨(dú)立存儲(chǔ)焚辅。
$_SESSION['uid'] = $userinfo['uid'];
$_SESSION['userinfo'] = $userinfo;
一般來說,登錄信息既可以存儲(chǔ)在session中苟鸯,也可以存儲(chǔ)在cookie中同蜻。他們之間的差別在于session可以方便的存取多種數(shù)據(jù)類型, 而cookie只支持字符串類型早处,同時(shí)對(duì)于一些安全性比較高的數(shù)據(jù)湾蔓,cookie需要進(jìn)行格式化與加密存儲(chǔ),而session存儲(chǔ)在服務(wù)端則安全性較高砌梆。
<?php
session_start();
//假設(shè)用戶登錄成功獲得了以下用戶數(shù)據(jù)
$userinfo = array(
    'uid'  => 10000,
    'name' => 'spark',
    'email' => 'spark@imooc.com',
    'sex'  => 'man',
    'age'  => '18'
);
header("content-type:text/html; charset=utf-8");
/* 將用戶信息保存到session中 */
$_SESSION['uid'] = $userinfo['uid'];
$_SESSION['name'] = $userinfo['name'];
$_SESSION['userinfo'] = $userinfo;
//* 將用戶數(shù)據(jù)保存到cookie中的一個(gè)簡(jiǎn)單方法 */
$secureKey = 'imooc'; //加密密鑰
$str = serialize($userinfo); //將用戶信息序列化
//用戶信息加密前
$str = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), $str, MCRYPT_MODE_ECB));
//用戶信息加密后
//將加密后的用戶數(shù)據(jù)存儲(chǔ)到cookie中
setcookie('userinfo', $str);
//當(dāng)需要使用時(shí)進(jìn)行解密
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), base64_decode($str), MCRYPT_MODE_ECB);
$uinfo = unserialize($str);
echo "解密后的用戶信息:<br>";
print_r($uinfo);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末默责,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子么库,更是在濱河造成了極大的恐慌傻丝,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诉儒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡亏掀,警方通過查閱死者的電腦和手機(jī)忱反,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門泛释,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人温算,你說我怎么就攤上這事怜校。” “怎么了注竿?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵茄茁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我巩割,道長(zhǎng)裙顽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任宣谈,我火速辦了婚禮愈犹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闻丑。我一直安慰自己漩怎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布嗦嗡。 她就那樣靜靜地躺著勋锤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪侥祭。 梳的紋絲不亂的頭發(fā)上怪得,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音卑硫,去河邊找鬼徒恋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛欢伏,可吹牛的內(nèi)容都是我干的入挣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼硝拧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼径筏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起障陶,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤滋恬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后抱究,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恢氯,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勋拟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勋磕。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖敢靡,靈堂內(nèi)的尸體忽然破棺而出挂滓,到底是詐尸還是另有隱情,我是刑警寧澤啸胧,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布赶站,位于F島的核電站,受9級(jí)特大地震影響纺念,放射性物質(zhì)發(fā)生泄漏贝椿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一柠辞、第九天 我趴在偏房一處隱蔽的房頂上張望团秽。 院中可真熱鬧,春花似錦叭首、人聲如沸习勤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽图毕。三九已至,卻和暖如春眷唉,著一層夾襖步出監(jiān)牢的瞬間予颤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工冬阳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛤虐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓肝陪,卻偏偏與公主長(zhǎng)得像驳庭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氯窍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 一饲常、會(huì)話控制(session與cookie) 1.cookie簡(jiǎn)介 Cookie是存儲(chǔ)在客戶端瀏覽器中的數(shù)據(jù),我們...
    空谷悠閱讀 617評(píng)論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理狼讨,服務(wù)發(fā)現(xiàn)贝淤,斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 一政供、會(huì)話控制 1播聪、cookie 簡(jiǎn)介:Cookie是存儲(chǔ)在客戶端瀏覽器中的數(shù)據(jù)朽基,我們通過Cookie來跟蹤與存儲(chǔ)用...
    yzw12138閱讀 286評(píng)論 0 0
  • 背景在HTTP協(xié)議的定義中,采用了一種機(jī)制來記錄客戶端和服務(wù)器端交互的信息犬耻,這種機(jī)制被稱為cookie踩晶,cooki...
    時(shí)芥藍(lán)閱讀 2,355評(píng)論 1 17
  • 父親從城里回來之后执泰,帶了一個(gè)淺咖色的和一個(gè)深咖色的瓶子枕磁,一個(gè)裝著乳白色細(xì)砂,一個(gè)裝著濃黑色的顆粒术吝。曉柔和姐妹們常常...
    瓜子520閱讀 133評(píng)論 0 0