session的工作原理與session用法


一直在使用session存儲數據,一直沒有好好總結一下session的使用方式以及其工作原理,今天在這里做一下梳理。  

這里的介紹主要是基於php語言,其他的語言操作可能會有差別,但基本的原理不變。

1.在php中如何操作session:

session_start();   //使用該函數打開session功能

$_session       //使用預定義全局變量操作數據

使用unset($_session['key']) //銷毀一個session的值

簡單地操作,一切都是由服務器實現;由於處理在后台,一切看起來也很安全。但是session采用什么樣機制,又是怎樣被實現,並且如何來保持會話的狀態的呢?

2.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中。

鏈接:https://pan.baidu.com/s/1v5gm7n0L7TGyejCmQrMh2g 提取碼:x2p5

免費分享,但是X度限制嚴重,如若鏈接失效點擊鏈接或搜索加群 群號518475424

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

session函數還有

session_cache_expire — return current cache expire

session_cache_limiter — get and/or set the current cache limiter

session_commit — alias of session_write_close

session_decode — decodes session data from a string

session_destroy — destroys all data registered to a session

session_encode — encodes the current session data as a string

session_get_cookie_params — get the session cookie parameters

session_id — get and/or set the current session id

session_is_registered — find out whether a global variable is registered in a session

session_module_name — get and/or set the current session module

session_name — get and/or set the current session name

session_regenerate_id — update the current session id with a newly generated one

session_register — register one or more global variables with the current session

session_save_path — get and/or set the current session save path

session_set_cookie_params — set the session cookie parameters

session_set_save_handler — sets user-level session storage functions

session_start — initialize session data

session_unregister — unregister a global variable from the current session

session_unset — free all session variables

session_write_close — write session data and end session


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM