HTTP 協議是 WEB 服務器與瀏覽器相互通訊的協議,它是一種無狀態協議,即每一個 HTTP 請求之間是相互獨立的。所以,HTTP 協議沒有一個內建的機制來維護兩個事務之間的狀態。好比,當一個用戶在請求一個頁面後再去請求另一個頁面時,HTTP 將沒法告訴咱們這兩個請求是否來自同一個用戶。php
在網站中,咱們常常須要跟蹤一個變量:經過對變量的跟蹤,使多個請求事物之間創建聯繫,再根據受權和用戶身份顯示不一樣的內容、不一樣頁面。這就是會話控制技術。
經常使用的會話控制技術有 Cookie
和 Session
。簡單地說,Cookie 是經過在客戶端中記錄信息而肯定用戶身份;Session 是經過在服務器端記錄信息而肯定用戶身份。redis
Cookie 是一個很小的文本文件,包含在 HTTP 請求報文中在 Web 服務器和瀏覽器之間傳遞。Cookie 的工做原理以下:瀏覽器
Set-Cookie
字段,並把 Cookie 數據放在 Set-Cookie
字段中隨着 HTTP 報文傳給瀏覽器;Set-Cookie
字段有值,會在本地建立一個 Cookie 文件來保存數據;Cookie 能夠用來保存用戶名、密碼、個性化設置等一些簡單的信息,如下是 Cookie 的使用說明:緩存
<?php setcookie("Cookie", "cookievalue", time()+3600);
必須在 HTML 文件的內容輸出以前調用 setcookie()
<?php echo $_COOKIE["Cookie"];
<?php #方法一:將值設爲空 setcookie("Cookie", null); #方法二:將過時時間設爲過去時間 setcookie("Cookie", "value" , time());
Session 是在服務器端保持用戶會話數據的一種方法,其工做原理以下:服務器
seesion_start()
函數會建立一個惟一的 Session ID(每一個客戶端都有一個惟一的標識),並自動經過 HTTP 的響應頭,將這個 Session ID 保存到客戶端 Cookie 中。同時,也在服務器端建立一個以 Session ID 命名的文件,用於保存這個用戶的會話信息;session_start()
函數就不會再去分配一個新的 Session ID,而是在服務器的硬盤中去尋找和這個 Session ID 同名的 Session 文件,將這以前爲這個用戶保存的會話信息讀出。首先,建立 Session 惟一標識的方法有兩種:經過 Cookie 或者 GET 方式。PHP 在默認狀況下使用 Session 會創建一個名叫 PHPSESSID
的 Cookie(能夠經過 php.ini 修改 session.name 的值),若是客戶端禁用cookie,能夠指定經過 GET 方式把 Session ID 傳到服務器(修改 php.ini 中 session.use_trans_sid
等參數)。其次,Session 是以文件的形式保存的。php.ini 中有個配置項 --session.save_path= ""
,這個裏面填寫的路徑,將會保存全部 Session 文件。Session 文件的命名格式是:sess_[PHPSESSID的值]
。每個文件,裏面保存了一個會話的數據。最後,保存在 Session 文件中的數據是通過序列化處理的,好比:cookie
cityID|i:0;cityName|s:3:"all";fanwe_lang|s:5:"zh-cn";fanwe_currency|a:4:{s:2:"id";s:1:"1";s:6:"name_1";s:9:"人民幣";s:4:"unit";s:3:"¥";s:5:"radio";s:6:"1.0000";}_fanwe_hash__|s:32:"77c18770c6cb5d89444c407aaa3e8477";
Session 一樣能夠用來保存用戶名、密碼、個性化設置等一些簡單的信息,如下是 Session 的使用說明:session
//啓動 session session_start(); //註冊session變量,賦值爲一個用戶的名稱 $_SESSION["username"] = "jochen"; //註冊session變量,賦值爲一個用戶的ID $_SESSION["uid"] = 1;
注意:必須在 HTML 文件的內容輸出以前調用 session_start()
<?php session_start(); echo $_SESSION["username"]; # # jochen echo $_SESSION["uid"]; # 1
<?php session_start(); unset($_SESSION["username"]); unset($_SESSION["uid"]);
須要注意的是,當 session 文件比較多的狀況下,將會產生 I/Q 讀寫性能問題。此時能夠採用 memcached、redis 等緩存系統。