簡(jiǎn)單使用
讀寫(xiě)session
Session_start();
$_SESSION["name"] = "value";
echo $_SESSION["name"];
銷(xiāo)毀session
session_unset();
session_destroy();
session_is_registered("gender")
讀sessionID
<?php
session_start();
echo session_id();
// 輸出 dqr58dnuqj2gufvg4o3tmjb9v4
?>
寫(xiě)sessionID
<?php
session_id("NowaMagic");
session_start();
echo session_id();
// 輸出 NowaMagic
?>
登錄超時(shí)的應(yīng)用
在每一個(gè)前端頁(yè)面與后臺(tái)交互時(shí)雀鹃,后臺(tái)均可通過(guò)判斷session是否超時(shí)溉瓶,來(lái)決定用戶(hù)可進(jìn)入當(dāng)前頁(yè)面還是強(qiáng)制用戶(hù)重新登錄。
- 在ThinkPhp中塔鳍,如何界面登錄超時(shí)柒爸?步驟如下:
- 通過(guò)執(zhí)行session操作記錄login_time受裹;
- 除登錄外的所有其他界面對(duì)應(yīng)的Controller均繼承BaseController,在BaseController的_initialize()函數(shù)中动猬,將執(zhí)行checkAdminSession()檢查是否登錄超時(shí)啤斗,如登錄未超時(shí),則把login_time變量賦值為當(dāng)前時(shí)間赁咙,并繼續(xù)刷新當(dāng)前界面钮莲,否則跳到Login界面。
猜測(cè)類(lèi)似Spring等框架將采用類(lèi)似操作彼水。
Session和Cookie的區(qū)別
- Session中同一瀏覽器同一站點(diǎn)只能有一個(gè)session_id,即一個(gè)session臂痕,cookie同。
- cookie存在客戶(hù)端猿涨,session存在服務(wù)端握童。
- 由于瀏覽器經(jīng)常禁用cookie,導(dǎo)致cookie是不可靠的叛赚,而session存在服務(wù)端澡绩,是可靠的。
- 用戶(hù)在連接服務(wù)器時(shí)俺附,會(huì)由服務(wù)器生成一個(gè)唯一的SessionID肥卡,用該SessionID 為標(biāo)識(shí)符來(lái)存取服務(wù)器端的Session存儲(chǔ)空間。SessionID是保存到客戶(hù)端的:a. 用Cookie保存的事镣,用戶(hù)提交頁(yè)面時(shí)步鉴,會(huì)將這一 SessionID提交到服務(wù)器端,來(lái)存取Session數(shù)據(jù)璃哟。這一過(guò)程氛琢,是不用開(kāi)發(fā)人員干預(yù)的; b. 如果客戶(hù)端Cookie禁用随闪,則服務(wù)器可以自動(dòng)通過(guò)重寫(xiě)URL的方式來(lái)保存Session的值阳似,并且這個(gè)過(guò)程對(duì)程序員透明。
可以試一下铐伴,即使不寫(xiě)Cookie撮奏,在使用request.getCookies();取出的Cookie數(shù)組的長(zhǎng)度也是1俏讹,而這個(gè)Cookie的名字就是JSESSIONID,還有一個(gè)很長(zhǎng)的二進(jìn)制的字符串畜吊,是SessionID的值泽疆。 - session由于存儲(chǔ)在服務(wù)器,會(huì)影響系統(tǒng)性能
session在大訪問(wèn)量網(wǎng)站上會(huì)影響系統(tǒng)性能玲献,影響性能的原因之一由文件系統(tǒng)設(shè)計(jì)造成殉疼,在同一個(gè)目錄下超過(guò)10000個(gè)文件時(shí),文件的定位將非常耗時(shí)青自,PHP支持 session目錄hash株依,我們可以通過(guò)修改php.ini中session.save_path = “2;/path/to/session/dir”驱证,那么session將存儲(chǔ)在兩級(jí)子目錄中延窜,每個(gè)目錄有16個(gè)子目錄[0~f],不過(guò)好像PHP session不支持創(chuàng)建目錄抹锄,你需要事先把那么些目錄創(chuàng)建好 逆瑞。
還有一個(gè)問(wèn)題就是小文件的效率問(wèn)題,一般我們的 session數(shù)據(jù)都不會(huì)太大(1~2K)伙单,如果有大量這樣1~2K的文件在磁盤(pán)上获高,IO效率肯定會(huì)很差,PHP手冊(cè)上建議使用Reiserfs文件系 統(tǒng)吻育,不過(guò)Reiserfs的前景堪憂念秧,Reiserfs的作者把媳婦給殺了,SuSE也拋棄了Reiserfs布疼。 - 應(yīng)用場(chǎng)景
cookie應(yīng)用場(chǎng)景:
a. 判斷用戶(hù)是否登陸過(guò)網(wǎng)站摊趾,以便下次登錄時(shí)能夠直接登錄。如果我們刪除cookie游两,則每次登錄必須從新填寫(xiě)登錄的相關(guān)信息砾层。
b. 另一個(gè)重要的應(yīng)用是“購(gòu)物車(chē)”中類(lèi)的處理和設(shè)計(jì)。用戶(hù)可能在一段時(shí)間內(nèi)在同一家網(wǎng)站的不同頁(yè)面選擇不同的商品贱案,可以將這些信息都寫(xiě)入cookie肛炮,在最后付款時(shí)從cookie中提取這些信息,當(dāng)然這里面有了安全和性能問(wèn)題需要我們考慮了宝踪。
session應(yīng)用場(chǎng)景:
a. 登錄超時(shí)判斷侨糟;
b. 保存購(gòu)物車(chē)信息;
比如在淘寶的產(chǎn)品詳情頁(yè)面瘩燥,提交了產(chǎn)品尺寸信息到服務(wù)器粟害,然后采用session保存該尺寸信息,在用戶(hù)點(diǎn)擊支付時(shí)颤芬,再將支付信息+產(chǎn)品尺寸信息(從session中讀缺)套鹅,統(tǒng)一寫(xiě)到數(shù)據(jù)庫(kù)即可。(無(wú)需用戶(hù)在前端每提交一個(gè)數(shù)據(jù)汰具,就保存到數(shù)據(jù)庫(kù)一次)
c. 保存驗(yàn)證碼信息
參考
php里session的用法(超級(jí)經(jīng)典)
淺談Session與Cookie的區(qū)別與聯(lián)系
ThinkPHP函數(shù)詳解:session方法
thinkphp中的session的使用和理解卓鹿!
PHP通過(guò)session id 實(shí)現(xiàn)session共享和登錄驗(yàn)證