以下是【金聰采編】分享的內(nèi)容全文:
cookie和session是web開發(fā)新手容易搞混的兩個概念,弄清楚兩者有助于對web交互更好的理解。個人認為session和cookie的區(qū)別主要有如下幾點:
cookie
信息保存在客戶端
具體實現(xiàn)由客戶端負責(zé)
數(shù)據(jù)大小和數(shù)量一般有限制
數(shù)據(jù)容易被竊取和篡改
session
數(shù)據(jù)保存在服務(wù)端
具體實現(xiàn)由服務(wù)器負責(zé)
數(shù)據(jù)大小和數(shù)量原則上無限制
安全性較高,可信度強
狹義的session指的是web會話中的session id以及關(guān)聯(lián)的數(shù)據(jù),廣義的session指通信雙方的交互會話。例如用戶登錄是一次session交互,在ATM機取錢是一次session交互,等等。
session的細節(jié)
session的主要作用是標識一個會話,并保存會話期間的數(shù)據(jù)。以下是session的一些細節(jié)。
存取
PHP通過$_SESSION超全局變量獲取和存放session中的所有數(shù)據(jù)。$_SESSION是一個數(shù)組,可以方便的進行賦值和讀取,例如:
$name = $_SESSION['NAME']; // 讀取session中的name值$_SESSION['NAME'] = 'new name'; // 賦新值unset($_SESSION['NAME']); // 移除session中的值
過期時間
默認session中的數(shù)據(jù)有可能在session超時后被移除,這取決于PHP是否及時運行垃圾回收。由于PHP運行垃圾回收的系數(shù)是請求數(shù),帶來的后果是:1. 低流量的站點超時很久后session數(shù)據(jù)也未被移除; 2. 大流量站點頻繁的進行session垃圾回收; 3. 運行垃圾回收在執(zhí)行用戶請求前,遇到了運行垃圾回收的用戶可能會感受到系統(tǒng)延遲。一個更好的解決辦法是禁用PHP的默認垃圾回收,以cron任務(wù)定時執(zhí)行session_gc函數(shù)。這樣既保證session的時效性,也能帶來性能和用戶體驗上的提升。
手動移除session中的數(shù)據(jù)可以用unset移除單個數(shù)據(jù)項,或者session_destroy函數(shù)暴力刪除所有的數(shù)據(jù)。
存儲介質(zhì)和序列化
session中的數(shù)據(jù)默認以文件形式保存在磁盤上,session打開時讀取文件內(nèi)容反序列化,然后填充$_SESSION數(shù)組。在大流量的站點中,存放session文件的目錄下會包含大量小文件,將對文件系統(tǒng)造成沉重的IO負擔(dān)。
session模塊中的handler可以指定數(shù)據(jù)保存方式,例如存放到數(shù)據(jù)庫中、redis/memcache等介質(zhì)中。PHP內(nèi)置的handler包括files(默認),redis和memcache。用戶可以通過session_set_save_handler來注冊自己的handler。
session中存放的數(shù)據(jù)可能是字符串等基本類型,也可能是數(shù)組、對象等復(fù)雜類型。session設(shè)置中的serialize_handler用來設(shè)置序列化和反序列化的handler,hanlder將數(shù)據(jù)序列化后,在交給save_handler保存。由序列化可知,resource等類型不能也不應(yīng)該保存到session中。把一個db的連接句柄保存到session中,然后10分鐘后再取出來用,這樣的想法應(yīng)該盡快拋掉。
session設(shè)置名稱
由于http是無狀態(tài)協(xié)議,客戶端請求時需要攜帶session id才能讓服務(wù)端區(qū)分出session。默認的標識session id的名稱是PHPSESSID,可以使用session_name來設(shè)置其他的名稱。例如為了防止攻擊者猜出后端是PHP語言的系統(tǒng),可以設(shè)置session id的名稱為JSESSIONID,迷惑攻擊者。
session自動開啟
目前主流的PHP版本默認都不會自動開啟session。例如某個訪客就隨便看一下頁面就離開,如果自動開啟session,將進行一系列的初始化操作后將session id發(fā)送到客戶端,以便下次訪問時能識別出用戶。對于一次性的訪客,或者非系統(tǒng)的登錄用戶,這些操作只會帶來額外的開銷。
session不自動開啟的劣勢是使用session前,要確保session已經(jīng)打開,否則可能取到空數(shù)據(jù)。如果重命名了默認的session名稱,需要在session_start前調(diào)用session_name指示目前使用的session名稱。
分布式session
大流量的站點,后端提供服務(wù)的往往不止一臺PHP服務(wù)器。如果用戶的多次請求不是落在同一臺服務(wù)器上,而服務(wù)器的session數(shù)據(jù)不共享,可能導(dǎo)致要求用戶重復(fù)登錄的情況發(fā)生。解決這個問題的方案既可在前端請求分發(fā)做,也可在后端通過設(shè)置分布式共享session來實現(xiàn)。
以文件形式保存session數(shù)據(jù)的系統(tǒng)中,可以指定某個目錄為共享目錄,所有服務(wù)器的session都保存在該目錄下;以redis/memcache/db等方式存放session的系統(tǒng)中,配置連接到同一個session服務(wù)器即可做到session共享。以session共享方式搭建的系統(tǒng),前端負載均衡器可以隨意分發(fā)請求到任意服務(wù)器上。
1.軟件源碼推廣展示:目的展示軟件相關(guān)功能,接收技術(shù)學(xué)習(xí)者測試、測評;
2.教程課程信息展示:展示課程信息,傳授課程各階段內(nèi)容;
3.設(shè)計素材圖片展示:展示素材設(shè)計理念、思維方式、傳播設(shè)計理念;
4.福利優(yōu)惠信息展示:分享各類最新的福利信息,各種優(yōu)惠信息展示;
以上分享目的僅供學(xué)習(xí)、參考使用,請勿用于其他用途,如果想商業(yè)使用或者代理,請自行聯(lián)系版權(quán)方獲取授權(quán)。任何未獲取授權(quán)的商業(yè)使用與本站無關(guān),請自行承擔(dān)相應(yīng)責(zé)任。
本站不存儲任何資源文件,敬請周知!
如果您認為本頁信息內(nèi)容侵犯了您的相關(guān)權(quán)益(包含但不限于:著作權(quán)、首發(fā)權(quán)、隱私權(quán)等權(quán)利),或者您認為自己是此信息的權(quán)利人但是此信息不是自己發(fā)布的,可以直接版權(quán)舉報投訴,我們會根據(jù)網(wǎng)站注冊協(xié)議、資源分享協(xié)議等協(xié)議處理,以保護您的合法權(quán)益。
本網(wǎng)站采用 BY-NC-SA 協(xié)議進行授權(quán) 轉(zhuǎn)載請注明原文鏈接:PHP學(xué)習(xí)筆記之session

侵權(quán)舉報/版權(quán)申訴



