咱們知道,session是在服務器端保持用戶會話數據的一種方法,對應的cookie是在客戶端保持用戶數據。HTTP協議是一種無狀態協 議,服務器響應完以後就失去了與瀏覽器的聯繫,最先,Netscape將cookie引入瀏覽器,使得數據能夠客戶端跨頁面交換,那麼服務器是如何記住衆 多用戶的會話數據呢?php
首先要將客戶端和服務器端創建一一聯繫,每一個客戶端都得有一個惟一標識,這樣服務器才能識別出來。建議惟一標識的方法有兩種:cookie 或者經過GET方式指定。默認配置的PHP使用session的時會創建一個名叫」PHPSESSID」的cookie(能夠經過php.ini修改 session.name值指定),若是客戶端禁用cookie,你也能夠指定經過GET方式把session id傳到服務器(修改php.ini中session.use_trans_sid等參數)。前端
咱們查看服務器端session.save_path目錄會發現不少相似sess_vv9lpgf0nmkurgvkba1vbvj915這 樣的文件,這個其實就是session id 「vv9lpgf0nmkurgvkba1vbvj915″對應的數據。真相就在這裏,客戶端將session id傳遞到服務器,服務器根據session id找到對應的文件,讀取的時候對文件內容進行反序列化就獲得session的值,保存的時候先序列化再寫入。sql
事實就是這樣,因此若是服務器不支持session或者你想自定義session,徹底能夠DIY,經過PHP的uniqid生成永不重複 的session id,而後找個地方存儲session的內容便可,你也能夠學flickr把session存儲在MySQL數據庫中。數據庫
瞭解的原理以後,所謂的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在大訪問量網站上確實影響系統性能,影響性能的緣由之一由文件系統設計形成,在同一個目錄下超過10000個文件時,文件的 定位將很是耗時,PHP支持session目錄hash,咱們能夠經過修改php.ini中session.save_path = 「2;/path/to/session/dir」,那麼session將存儲在兩級子目錄中,每一個目錄有16個子目錄[0~f],不過好像PHP session不支持建立目錄,你須要事先把那麼些目錄建立好 。cookie
還有一個問題就是小文件的效率問題,通常咱們的session數據都不會太大(1~2K),若是有大量這樣1~2K的文件在磁盤上,IO效 率確定會不好,PHP手冊上建議使用Reiserfs文件系統,不過Reiserfs的前景堪憂,Reiserfs的做者把媳婦給殺了,SuSE也拋棄了 Reiserfs。session
其實還有不少中存儲session的方式,能夠經過php -i|grep 「Registered save handlers」查看,好比Registered save handlers => files user sqlite eaccelerator能夠經過文件、用戶、sqlite、eaccelerator來存,若是服務器裝了memcached,還有會mmcache的 選項。固然還有不少,好比MySQL、PostgreSQL等等。都是不錯的選擇。負載均衡
咱們前端可能有不少臺服務器,用戶在A服務器上登陸了,種下了session信息,而後訪問網站的某些頁面沒準跳到B服務器上去了,若是這個時候B服務器上沒有session信息又沒有作特殊處理,可能就會出問題了。運維
session同步有不少種,若是你是存儲在memcached或者MySQL中,那就很容易了,指定到一樣的位置便可,若是是文件形式的,你能夠用NFS統一存儲。
還有一種方式是經過加密的cookie來實現,用戶在A服務器上登陸成功,在用戶的瀏覽器上種上一個加密的cookie,當用戶訪問B服務 器時,檢查有無session,若是有固然沒問題,若是沒有,就去檢驗cookie是否有效,cookie有效的話就在B服務器上重建session。這 種方法其實頗有用,若是網站有不少個子頻道,服務器也不在一個機房,session沒辦法同步又想作統一登陸那就太有用了。
固然還有一種方法就是在負載均衡那一層保持會話,把訪問者綁定在某個服務器上,他的全部訪問都在那個服務器上就不須要session同步了, 這些都是運維層面的東西。就說這麼多吧,根據本身的應用來選擇使用session,不要由於你們都說session影響系統性能就畏首畏尾,知道問題,解 決問題纔是關鍵,惹不起躲得起不適合這裏。
轉自:http://www.nowamagic.net/librarys/veda/detail/358