簡單使用

讀寫session

Session_start();
$_SESSION["name"] = "value";
echo $_SESSION["name"];

銷毀session

session_unset();
session_destroy();
session_is_registered("gender")

讀sessionID

<?php  
    session_start();   
    echo session_id();  
    // 輸出 dqr58dnuqj2gufvg4o3tmjb9v4  
?>

寫sessionID

<?php  
    session_id("NowaMagic");  
    session_start();   
    echo session_id();  
    // 輸出 NowaMagic  
?>

登錄超時的應用

在每一個前端頁面與後台交互時,後台均可通過判斷session是否超時,來決定用戶可進入當前頁面還是強制用戶重新登錄。

  • 在ThinkPhp中,如何界面登錄超時?步驟如下:
    1. 通過執行session操作記錄login_time;
    2. 除登錄外的所有其他界面對應的Controller均繼承BaseController,在BaseController的_initialize()函數中,將執行checkAdminSession()檢查是否登錄超時,如登錄未超時,則把login_time變量賦值為當前時間,並繼續刷新當前界面,否則跳到Login界面。
      猜測類似Spring等框架將採用類似操作。

Session和Cookie的區別

  • Session中同一瀏覽器同一站點只能有一個session_id,即一個session,cookie同。
  • cookie存在客戶端,session存在服務端。
  • 由於瀏覽器經常禁用cookie,導致cookie是不可靠的,而session存在服務端,是可靠的。
  • 用戶在連接服務器時,會由服務器生成一個唯一的SessionID,用該SessionID 為標識符來存取服務器端的Session存儲空間。SessionID是保存到客戶端的:a. 用Cookie保存的,用戶提交頁面時,會將這一 SessionID提交到服務器端,來存取Session數據。這一過程,是不用開發人員干預的; b. 如果客戶端Cookie禁用,則服務器可以自動通過重寫URL的方式來保存Session的值,並且這個過程對程序員透明。
    可以試一下,即使不寫Cookie,在使用request.getCookies();取出的Cookie數組的長度也是1,而這個Cookie的名字就是JSESSIONID,還有一個很長的二進制的字符串,是SessionID的值。
  • session由於存儲在服務器,會影響系統性能
    session在大訪問量網站上會影響系統性能,影響性能的原因之一由文件系統設計造成,在同一個目錄下超過10000個文件時,文件的定位將非常耗時,PHP支持 session目錄hash,我們可以通過修改php.ini中session.save_path = “2;/path/to/session/dir”,那麼session將存儲在兩級子目錄中,每個目錄有16個子目錄[0~f],不過好像PHP session不支持創建目錄,你需要事先把那麼些目錄創建好 。
    還有一個問題就是小文件的效率問題,一般我們的 session數據都不會太大(1~2K),如果有大量這樣1~2K的文件在磁盤上,IO效率肯定會很差,PHP手冊上建議使用Reiserfs文件系 統,不過Reiserfs的前景堪憂,Reiserfs的作者把媳婦給殺了,SuSE也拋棄了Reiserfs。
  • 應用場景
    cookie應用場景:
    a. 判斷用戶是否登陸過網站,以便下次登錄時能夠直接登錄。如果我們刪除cookie,則每次登錄必須從新填寫登錄的相關信息。
    b. 另一個重要的應用是“購物車”中類的處理和設計。用戶可能在一段時間內在同一家網站的不同頁面選擇不同的商品,可以將這些信息都寫入cookie,在最後付款時從cookie中提取這些信息,當然這裏面有了安全和性能問題需要我們考慮了。
    session應用場景:
    a. 登錄超時判斷;
    b. 保存購物車信息;
    比如在淘寶的產品詳情頁面,提交了產品尺寸信息到服務器,然後採用session保存該尺寸信息,在用戶點擊支付時,再將支付信息+產品尺寸信息(從session中讀取),統一寫到數據庫即可。(無需用戶在前端每提交一個數據,就保存到數據庫一次)
    c. 保存驗證碼信息

參考

php里session的用法(超級經典)
淺談Session與Cookie的區別與聯繫
ThinkPHP函數詳解:session方法
thinkphp中的session的使用和理解!
PHP通過session id 實現session共享和登錄驗證