看其session之前,希望你有時間可以先去了解一下Cookie機制,因爲Session其一部分是基於Cookie機制的。以下是我關於Cookie的博客:
http://blog.csdn.net/zch501157081/article/details/52028467
不同於COOKIE技術,將會話數據存儲在服務器端。(這是Cookie和Session最本質的區別,下面會有說道)
那麼Session是如何區分會話數據屬於哪臺瀏覽器?
一:將不同會話的session數據分別存儲。存在在session數據區。
二:爲每個數據區,設置一個的唯一的標識。
三:將該唯一標識,分配到瀏覽器端,瀏覽器請求時攜帶。
可見,session技術,基於 COOKIE技術。Session的標識(session-ID)是存儲於瀏覽器的COOKIE中。
那麼對比與COOKIE:
Session會話數據本身,安全性較高,(因爲他將更多的數據存儲在服務器端)
請求時攜帶的數據量,減少。但是不得不說會對服務器造成或多或少的壓力。
Session基本操作
開啓Session
只有開啓了session,PHP的核心session功能,才能,生成唯一標識,分配標識到瀏覽器,存儲數據到數據區。
即:
管理session數據
超全局數組:$_SESSION,完成所有的功能。
增刪改查
注意:清空session操作,刪除所有的session數據:
注:這裏不能用unset ( $_SESSION)來刪除session數據,原因在於他只是刪除了$_SESSION 這個變量,而並沒有修改session數據區裏面的值,所以並不能修改。關於操作session文件的週期下面會說到。
服務器端session會話數據區
默認 :
存儲在服務器端操作系統臨時目錄中的一個個獨立的session數據區文件。
存儲方式(文件),及其存儲位置(系統臨時目錄)都是可以被配置的,配置項:php.ini:
方式:
位置:
默認註釋起來;wamp在 /wamp/tmp環境下。
建議修改時使用ini_set()進行修改,而不是去修改Php.ini。其目的修改的結果僅僅對於當前腳本週期有效,不會影響其他項目!
修改配置:
瀏覽器端COOKIE中存儲的Session-ID
其一:瀏覽器端不存在session-ID
瀏覽器向服務器請求時,不會攜帶session-ID。
服務器端由於要使用session機制,就會生成session-ID,在響應時分配給瀏覽器端。
其二:瀏覽器端已經存在session-ID
瀏覽器向服務器發出請求時,攜帶session-ID到服務器端:
服務器端需要開啓session機制,但由於瀏覽器已經攜帶了session-ID,就不需要重新生成,直接使用瀏覽器攜帶的即可。
SESSION週期內的運行流程
如圖所示:
很關鍵,表示了SESSION週期內的運行流程,有些內容下面會說到。
要點:
一:$sessionid的確定
二:$_SESSION這個變量,是在session_start()過程中,初始化的(定義並設置值)
三:僅僅在腳本週期內,操作$_SESSION,而不是去操作session數據區。
四:只有在腳本週期結束時,纔會將當前腳本週期內處理好的session數據,存儲到session數據
區中去。
五:每次請求都是相同的邏輯。
Session數據的屬性
有效期,有效路徑,有效域名,是否僅安全連接傳輸,是否爲HTTPOnly
首先:session數據不像COOKIE數據,每個值都可以設置屬性。
Session數據的屬性是針對於所有的session數據。
其次:導致session數據屬性的原因,是存儲在瀏覽器端COOKIE中的session-ID的屬性導致的。
就是指的是,該COOKIE變量的屬性:PHPSESSID=XXXXXXXXXX,影響到與之關聯的session數據的屬性。
以上默認值,都是由PHP的配置項:php.ini決定:(以下都可以在php.ini中找到,給出的都是默認值)
Session-ID這個COOKIE變量的名(key):session.name=PHPSESSID
有效期:會話結束(瀏覽器關閉):session.cookie_lifetime=0;
有效路徑:session的有效路徑,整站有效。session.cookie_path = /;
有效域名:當前域名 session.cookie_domain = ;
是否僅僅安全連接傳輸: 否。session.cookie_secure = ;
是否爲HTTPOnly :否 session.cookie_httponly = ;
那麼如何修改該COOKIE變量的屬性
1. 修改php.ini(不建議)
2. ini_set() 在開啓session之前。每次開啓session之前。
3. session_set_cookie_params();(推薦)
Session機制專門爲設置COOKIE的屬性而,創建的函數。
語法會簡單寫。
Session_set_cookie_params(有效期,有效路徑,有效域,是否secure,是否httponly);
常見的修改:有效域名和httponly
數據類型的支持
Session支持多種數據類型,都支持。除了資源!
可見,所有的類型都可以被存儲。
但是在獲取session中存儲的對象時,一定要存在該類的定義纔可以:
否則會出現類會變成這樣
銷燬Session
調用了函數:
Session_destroy()
執行了銷燬session!
銷燬session包含兩個工作:
其一:刪除session對應的數據區(文件)
其二:關閉session。
Session_destroy()僅僅會刪除對應的數據區文件,而不會刪除$_SESSION這個變量。
測試如下:
再刷新一次:
就沒有數據了
爲什麼會這樣呢,具體請參考SESSION週期內的運行流程圖,在執行session_start()時,服務器就將文件中的session內容拿出,並賦給$_SESSION,而session_destroy()並不會刪除\$_SESSION這個變量,所以輸出還是會有值。(下個週期就不會有值傳入\$_session值中)。
那麼如何完全刪除和當前session相關的內容?
必須要刪除 Session文件,$_SESSION變量,COOKIE中的session-ID
如下
Session的垃圾回收,GC
PHP的session功能,會自動的刪除那些過期的服務器端session數據區文件。
如何判別垃圾?
判斷數據區文件,是否超過了多久,沒有被使用。默認是1440s。
該值可以被配置:
配合上,上次修改時間,計算是否過期。(上次激活時間,只要是活躍(瀏覽器攜帶sessionid訪問服務器)一次都算)
如何刪除?
當開啓session機制時。執行session_start()時,有概率的去 執行刪除過期session數據區文件的操作。默認的概率:1/1000。由下面的配置決定:
可能性:
基數(除數):
即:默認1/1000的概率 。有人會說概率很小的,但是不得不考慮你的一次點擊都會觸發一次session_start。
當然你也可以根據你的需求進行修改。
如何持久化session
持久化瀏覽器端session-ID:
Session_set_cookie_params(3600)
持久化服務器端session數據區:
Ini_set(‘session.gc_maxlifetime’, ‘3600’);
COOKIE禁用,session是否可用
不能用!
但是理論上是可能的
想辦法使用非cookie,向服務器端,每次請求傳session-Id即可!
GET,url
POST,表單元素。
PHP支持該配置,支持從URL或者表單post數據中獲取session-ID。並且支持自動在URL後和表單內,增加session-ID數據,自動傳輸:
這個是要在php.ini中配置的,這裏就不詳細說了。(真的不經常用)。
至於Session的一些安全性措施 可以查看
http://netsecurity.51cto.com/art/201402/428721.htm