1. 程式人生 > >描述session的執行機制和工作原理

描述session的執行機制和工作原理


瀏覽器和伺服器採用http無狀態的通訊,為了保持客戶端的狀態,使用session來達到這個目的。然而服務端是怎麼樣標示不同的客戶端或使用者呢?
這裡我們可以使用生活中的一個例子,假如你參加一個晚會,認識了很多人,你會採取什麼方式來區分不同的人呢!你可能根據臉型,也有可能根據使用者的名字,
或者人的身份證,即採用一個獨一無二的標示。在session機制中,也採用了這樣的一個唯一的session_id來標示不同的使用者,不同的是:瀏覽器每次請求都會帶上
由伺服器為它生成的session_id.

簡單介紹一下流程:當客戶端訪問伺服器時,伺服器根據需求設定session,將會話資訊儲存在伺服器上,同時將標示session的session_id傳遞給客戶端瀏覽器,
瀏覽器將這個session_id儲存在記憶體中(還有其他的儲存方式,例如寫在url中),我們稱之為無過期時間的cookie。瀏覽器關閉後,這個cookie就清掉了,它不會存在使用者的cookie臨時檔案。
以後瀏覽器每次請求都會額外加上這個引數值,再伺服器根據這個session_id,就能取得客戶端的資料狀態。

如果客戶端瀏覽器意外關閉,伺服器儲存的session資料不是立即釋放,此時資料還會存在,只要我們知道那個session_id,就可以繼續通過請求獲得此session的資訊;但是這個時候後臺的session還存在,但是session的儲存有一個過期
時間,一旦超過規定時間沒有客戶端請求時,他就會清除這個session。

下面介紹一下session的儲存機制,預設的session是儲存在files中,即以檔案的方式儲存session資料。在php中主要根據php.ini的配置session.save_handler
來選擇儲存session的方式。

這裡順便說明一下,如果要做伺服器的lvs,即多臺server的話,我們一般使用memcached的方式session,否則會導致一些請求找不到session。
一個簡單的memcache配置:
session.save_handler = memcache
session.save_path = "tcp://10.28.41.84:10001"

當然如果一定要使用files檔案快取,我們可以將檔案作nfs,將所有的儲存session檔案定位到一個地方。

剛才講返回給使用者的session-id最終儲存在記憶體中,這裡我們也可以設定引數將其儲存在使用者的url中。



3.例項問題
現有系統A,B; 假設A系統是可以獨立執行的web系統,即可以和瀏覽器直接處理session, B系統是基於mobile的,需要呼叫A系統的功能介面,
在保持A不改變的情況下,即登陸驗證,session儲存都不變的情況下,B系統能處理前端使用者的請求。

這裡提供的方案是使用PHP實現

在使用者登陸成功後,將儲存的session的session-id返回給B系統,然後B系統每次請求其他介面都帶session_id。
A系統在session_start前加上session_id(session_id);

這樣B系統就能安全的呼叫A