萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> php中Session工作原理與用法詳解

php中Session工作原理與用法詳解

有很我朋友會問Session是如何工作的它與cookies有會有什麼區別呢,下面我們一給各位同學介紹一下關於Session工作原理,有需要了解的朋友可進入參考。


1.什麼是Session

2.Session從用戶訪問頁面開始,到斷開與網站連接為止,形成一個會話的生命周期。在會話期間,分配客戶唯一的一個SessionID,用來標識當前用戶,與其他用戶進行區分。
3.Session會話時,SessionID會分別保存在客戶端和服務器端兩個位置,對於客戶端使用臨時的Cookie保存(Cookie名稱為PHPSESSID)或者通過URL字符串傳遞,服務器端也以文本文件形式保存在指定的Session目錄中。
4.Session通過ID接受每一個訪問請求,從而識別當前用戶、跟蹤和保持用戶具體資料,以及Session變量(在Session活動期間,可在Session中存儲數字或文字資料),比如session_name等等,這些變量信息保存在服務器端。
5.SessionID可以作為會話信息保存到數據庫中,進行Session持久化,這樣可以跟蹤每個用戶的登陸次數、在線與否、在線時間等。
session.name=PHPSESSID;用在cookie裡的session的名字

•session.save_handler=files;用於保存/取回數據的控制方式
•session.save_path=/tmp;在save_handler設為文件時傳給控制器的參數,這是數據文件將保存的路徑.
•session.use_cookies=1;是否使用cookies

在php中如何操作session:

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

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

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

簡單地操作,一切都是由服務器實現;由於處理在後台,一切看起來也很安全。但是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中。

 

使用session之前為什麼必須先執行session_start()?

了解的原理之後,所謂的session其實就是客戶端一個session id服務器端一個session file,新建session之前執行session_start()是告訴服務器要種一個cookie以及准備好session文件,要不然你的session內容怎麼存;讀取session之前執行session_start()是告訴服務器,趕緊根據session id把session文件反序列化。

只有一個session函數可以在session_start()之前執行,session_name():讀取或指定session名稱(比如默認的就是”PHPSESSID”),這個當然要在session_start之前執行。

session影響系統性能

session在大訪問量網站上確實影響系統性能,影響性能的原因之一由文件系統設計造成,在同一個目錄下超過10000個文件時,文件的定位將非常耗時,PHP支持session目錄hash,我們可以通過修改php.ini中session.save_path = “2;/path/to/session/dir”,那麼session將存儲在兩級子目錄中,每個目錄有16個子目錄[0~f],不過好像PHP session不支持創建目錄,你需要事先把那麼些目錄創建好 。

還有一個問題就是小文件的效率問題,一般我們的session數據都不會太大(1~2K),如果有大量這樣1~2K的文件在磁盤上,IO效率肯定會很差,PHP手冊上建議使用Reiserfs文件系統,不過Reiserfs的前景堪憂,Reiserfs的作者把媳婦給殺了,SuSE也拋棄了Reiserfs。

其實還有很多中存儲session的方式,可以通過php -i|grep “Registered save handlers”查看,比如Registered save handlers => files user sqlite eaccelerator可以通過文件、用戶、sqlite、eaccelerator來存,如果服務器裝了memcached,還有會mmcache的選項。當然還有很多,比如MySQL、PostgreSQL等等。都是不錯的選擇。

session的同步
我們前端可能有很多台服務器,用戶在A服務器上登錄了,種下了session信息,然後訪問網站的某些頁面沒准跳到B服務器上去了,如果這個時候B服務器上沒有session信息又沒有做特殊處理,可能就會出問題了。

session同步有很多種,如果你是存儲在memcached或者MySQL中,那就很容易了,指定到同樣的位置即可,如果是文件形式的,你可以用NFS統一存儲。

還有一種方式是通過加密的cookie來實現,用戶在A服務器上登錄成功,在用戶的浏覽器上種上一個加密的cookie,當用戶訪問B服務器時,檢查有無session,如果有當然沒問題,如果沒有,就去檢驗cookie是否有效,cookie有效的話就在B服務器上重建session。這種方法其實很有用,如果網站有很多個子頻道,服務器也不在一個機房,session沒辦法同步又想做統一登錄那就太有用了

實例問題
現有系統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

copyright © 萬盛學電腦網 all rights reserved