【PHP基礎知識】——Session的詳解與使用

一、前言

        之前的文章已經介紹了Cookie可以讓服務端程序跟蹤每個客戶端的訪問,但是每次客戶端的訪問都必須傳回這些Cookie,如果Cookie很多,這無形地增加了客戶端與服務端的數據傳輸量,爲了解決這個問題,Session就出現了。

二、概念

Session機制是一種服務器端的機制,服務器使用一種類似於散列表的結構(也可能就是使用散列表)來保存信息。
相比於保存在客戶端的Cookie,Session將用戶交互信息保存在了服務器端,使得同一個客戶端每次和服務端交互時,不需要每次都傳回所有的Cookie值,而是只要傳回一個ID,這個ID是客戶端第一次訪問服務器的時候生成的,而且每個客戶端是唯一的。這樣就實現了一個ID就能在服務器取得所有的用戶交互信息


三、Session的工作流程

1、session的創建:session是在客戶端與服務器交互的過程中,由服務器創建的,並且會返回一個session的Id給客戶端,一個會話只能有一個session對象;
2、在此後的交互過程中,客戶端在請求中帶上這個ID;
3、服務器可根據此Session ID獲取到對應的保存在服務器內存中的session內容,以便於識別用戶並提取用戶信息。

                     

             (圖片來自於http://blog.csdn.net/happyguys12345/article/details/74910595)

注:一般情況下客戶端session的ID都是通過Cookie的方式與服務器交互的,對於客戶端禁用了Cookie的情況,可以通過在請求的Url中帶上這個Session ID達到使用Session的目的。(也有一些在頁面表單隱藏字段添加session id的,但是需要請求有提交表單的行爲時纔可實現session交互)

四、Session的生命週期

Session在以下情況會被刪除失效:
1、Session超時:超時指的是連續一定時間服務器沒有收到該Session所對應客戶端的請求,並且這個時間超過了服務器設置的Session超時的最大時間;
2、程序調用方法主動銷燬session;
3、服務器關閉或服務停止。


五、Session的作用範圍

一般來說,每次請求不同的域都會新創建一個session:

對於多標籤的瀏覽器來說,在一個瀏覽器窗口中,多個標籤同時訪問一個頁面,session是一個。

對於多個瀏覽器窗口之間,同時或者相隔很短時間訪問一個頁面,session是多個的,和瀏覽器的進程有關。

對於一個同一個瀏覽器窗口,直接錄入url訪問同一應用的不同資源,session是一樣的。

比如PHP寫的服務端,每次打開同一個域名網站的頁面都是一樣的session,在多個標籤裏面也是一樣;但在多個窗口就是不一樣的(可能有些瀏覽器不是),訪問不同的域也是不一樣的,除非做了Session同步機制。

六、PHP操作Session方法

php的session默認情況下是使用客戶端Cookie。當客戶端的Cookie被禁用時,會自動通過URL的Query_String傳遞。 

(必須在php.ini中做以下配置:

session.use_trans_sid=1   //是否開啓url傳遞PHPSESSION ID
session.use_only_cookies=0 //是否只允許使用Cookie 傳遞PHPSESSION ID
session.use_cookies=1 //是否開啓Cookie傳遞PHPSESSION ID

需要保證服務器有session.save_path路徑的必要權限。
)


1、session創建:在PHP中創建Session是用session_start()方法,同Cookie一樣,必須將這個函數置於最先,而且在它之前不能有任何輸出,否則會報錯。同理可以用之前文章介紹過的輸出緩衝的方法避免。

2、清空session:session_destroy()方法,此函數沒有參數,且返回值均爲true。
3、獲取Session:PHP中獲取session用$_SESSION[$name]變量獲取,該變量在接收到請求時會自動獲取到請求裏面帶有的Session id,並以數組的格式提取保存着該ID所帶有的在服務器端的session數據(session的數據也是採用Key/Value的格式,value格式可支持多種);
4、Session值的修改更新:

可直接通過給$_SESSION[$name]變量賦值的格式更新session值,並且可以立即生效。


七、實際應用中session存在的問題與不足

1、爲了彌補http協議的無狀態的特點,服務端會佔用一定的內存和cpu用來存儲和處理session計算的開銷,在大流量大訪問量的網站中,這會導致大量的佔用服務器內存和計算速度
2、有些高訪問量的站點,需要部署多個服務器,多臺服務器對外提供的服務是等價的,這樣可以減少每臺服務器的壓力,但是同一個用戶的多次請求可能會訪問到多臺服務器,每臺服務器的同一個Session ID必須對應同一個Session內容,這就需要Session在多臺服務器之間實現同步
3、每個用戶在每臺服務器之間的Session ID都應該標識用戶自己,所以多個服務器之間的不同session必須是相互獨立的


八、Session同步的方案

多臺服務器之間必須共享session,所以session同步到各個服務器的方式就是把session保存起來,讓各個服務器都可以訪問到這個保存的地方;可以保存到文件、數據庫、內存等,由於文件和數據庫是IO讀寫,效率比較低,所以目前最好的方案是將Session保存在內存中。
很多大型企業採用的方案是在單獨的緩存服務器如memcache或者Redis裏面保存Session,同步到各個服務器這種方案。


當然Session還有很多值得我們學習和探討的問題,例如:
1、Session 存儲的多元化;
2、Session 配置的動態修改;
3、Session 加密 key 的定期修改。


發佈了44 篇原創文章 · 獲贊 61 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章