PHP 會話控制

會話控制

HTTP 協議是 WEB 服務器與瀏覽器相互通訊的協議,它是一種無狀態協議,即每一個 HTTP 請求之間是相互獨立的。所以,HTTP 協議沒有一個內建的機制來維護兩個事務之間的狀態。好比,當一個用戶在請求一個頁面後再去請求另一個頁面時,HTTP 將沒法告訴咱們這兩個請求是否來自同一個用戶。php

在網站中,咱們常常須要跟蹤一個變量:經過對變量的跟蹤,使多個請求事物之間創建聯繫,再根據受權和用戶身份顯示不一樣的內容、不一樣頁面。這就是會話控制技術。

經常使用的會話控制技術有 CookieSession。簡單地說,Cookie 是經過在客戶端中記錄信息而肯定用戶身份;Session 是經過在服務器端記錄信息而肯定用戶身份。redis

Cookie

Cookie 是一個很小的文本文件,包含在 HTTP 請求報文中在 Web 服務器和瀏覽器之間傳遞。Cookie 的工做原理以下:瀏覽器

  1. 服務器經過在 HTTP 響應報文中設置一個 Set-Cookie 字段,並把 Cookie 數據放在 Set-Cookie 字段中隨着 HTTP 報文傳給瀏覽器;
  2. 瀏覽器在接收到 HTTP 響應報文後,檢查到 Set-Cookie 字段有值,會在本地建立一個 Cookie 文件來保存數據;
  3. 當瀏覽器再次向該服務器發送請求時,瀏覽器會先搜索本地保存的 Cookie 文件,若是在 Cookie 文件中有任何與正在鏈接的 URL 相關的 Cookie,就在 HTTP 請求報文中設置一個 Cookie 字段,並把 Cookie 文件中的數據添加到該字段中,最後把攜帶 Cookie 字段的 HTTP 請求報文發送給服務器。

Cookie 能夠用來保存用戶名、密碼、個性化設置等一些簡單的信息,如下是 Cookie 的使用說明:緩存

建立
<?php
setcookie("Cookie", "cookievalue", time()+3600);
必須在 HTML 文件的內容輸出以前調用 setcookie()
接收
<?php
echo $_COOKIE["Cookie"];
刪除
<?php
#方法一:將值設爲空
setcookie("Cookie", null);

#方法二:將過時時間設爲過去時間
setcookie("Cookie", "value" , time());

Session

Session 是在服務器端保持用戶會話數據的一種方法,其工做原理以下:服務器

  1. 當瀏覽器第一次訪問 PHP 腳本時,seesion_start() 函數會建立一個惟一的 Session ID(每一個客戶端都有一個惟一的標識),並自動經過 HTTP 的響應頭,將這個 Session ID 保存到客戶端 Cookie 中。同時,也在服務器端建立一個以 Session ID 命名的文件,用於保存這個用戶的會話信息;
  2. 當同一個用戶再次訪問這個網站時,會自動經過 HTTP 的請求頭將 Cookie 中保存的 Seesion ID 再攜帶過來;
  3. 服務器 PHP 腳本接受到客戶端請求,這時 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 等緩存系統。
相關文章
相關標籤/搜索