Session for PHP

看其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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章