什么是Cookie
HTTP協議是無狀態協議,服務器本身無法判斷用戶身份,我們可以通過Cookie來跟蹤用戶狀態,Cookie是一種在遠程瀏覽器端存儲數據並以此來跟蹤和識別用戶的機制。簡單地說, Cookie是Web服務器暫時存儲在用戶硬盤上的一個文本文件,並隨后被Web瀏覽器讀取。一般情況下,Cookie通過HTTP headers從服務端返回到客戶端。
PHP通過setcookie函數進行Cookie的設置,任何從瀏覽器發回的Cookie,PHP都會自動的將他存儲在$_COOKIE的全局變量之中,因此我們可以通過$_COOKIE['key']的形式來讀取某個Cookie值。
PHP中的Cookie具有非常廣泛的使用,經常用來存儲用戶的登錄信息,購物車等,且在使用會話Session時通常使用Cookie來存儲會話id來識別用戶,Cookie具備有效期,當有效期結束之后,Cookie會自動的從客戶端刪除。
Cookie的生命周期
- 如果Cookie不設定時間,就表示它的生命周期為瀏覽器會話的期間,只要關閉瀏覽器,Cookie就會自動消失。這種Cookie被稱為會話Cookie,一般不保存在硬盤上,而是保存在內存中。
- 如果設置了過期時間,那么瀏覽器會把Cookie保存到硬盤中,再次打開瀏覽器時會依然有效,直到它的有效期超時。
- 雖然Cookie可以長期保存在客戶端瀏覽器中,但也不是一成不變的。因為瀏覽器最多允許存儲300個 Cookie文件,而且每個Cookie文件支持最大容量為4KB;每個域名最多支持20個Cookie,如果達到限制時,瀏覽器會自動地隨機刪除Cookies。
什么是Session
Session 譯為“會話”,其本義是指有始有終的一系列動作/消息,如打電話時從拿起電話撥號到掛斷電話這一系列過程可以稱為一個Session。
在計算機專業術語中, Session是指一個終端用戶與交互系統進行通信的時間間隔,通常指從注冊進入系統到注銷退出系統所經過的時間。因此,,Session實際上是一個特定的時間概念。
Session的工作原理
- 准備建立一個Session會話的時候,PHP會先查看請求中是否包含session_id,如果沒有服務器會在自己的內存里創建一個隨機且唯一的session_id。
- 服務器會把這個session_id發送到瀏覽器保存,一般瀏覽器會把這個id保存在Cookie中。
- 之后瀏覽器再去訪問服務器時,都會攜帶這個在Cookie中存儲的session_id,當關閉瀏覽器時,id會自動注銷,重新打開登陸此頁面,會再次生成一個隨機且唯一的id。
- 服務器可以通過session_id存放會話數據,這些數據時經過序列化后存放進去的,session_id就是Session存放數據的文件名。
- 當瀏覽器訪問服務器時,可以憑借自己的session_id到服務器中獲取存放的信息。
- 如果想銷毀會話,可以刪除會話中的數據,銷毀會話文件。
Session的生命周期
- 會話發起會生成一個session_id,默認瀏覽器關閉則id自動注銷,重新打開瀏覽器會生成一個新的session_id。當然如果需要,可以通過Cookie來設置session_id的失效時間,以達到關閉瀏覽器后能找到原來session_id的目的。
- Session生成后,只要用戶繼續訪問,服務器就會更新Session的最后訪問時間,並維護該Session。為防止內存溢出,服務器會定期檢查Session的最后訪問時間,如果這個時間超出Session設置的過期時間,服務器就會銷毀這個Session,那么客戶端即使把session_id又傳上來,服務器也找不到它的Session了,只會再重新創建一個新的Session。
Session和Cookie的區別
- Cookie數據存放在客戶端瀏覽器上,Session數據存放在服務器上。
- Cookie相對不是太安全,容易被盜用導致Cookie欺騙,考慮到安全應當使用Session。
- 單個Cookie文件支持最大容量為4KB,每個域名最多支持20個Cookie,如果達到限制時,瀏覽器會自動地隨機刪除Cookies。而Session則沒有這方面的限制。
- Session是通過一個session_id進行用戶識別,PHP默認情況下session_id是通過Cookie來保存的,因此從某種程度上來說,Session依賴於Cookie。但這不是絕對的,session_id也可以通過參數來實現,只要能將session_id傳遞到服務端進行識別的機制都可以使用Session。
- Cookie保存在客戶端,不占用服務器資源。Session保存在服務器端,如果並發訪問量太大,會消耗大量的內存。