簡單使用
讀寫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中,如何界面登錄超時?步驟如下:
- 通過執行session操作記錄login_time;
- 除登錄外的所有其他界面對應的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共享和登錄驗證