PHP
SESSION原理
我們知道,session是在伺服器端保持使用者會話資料的一種方法,對應的cookie是
在客戶端保持用戶資料。 HTTP協定是一種無狀態協議,伺服器回應完後就失去了與瀏覽器的聯繫,最早,Netscape將cookie引入瀏覽器,使得
資料可以客戶端跨頁面交換,那麼伺服器是如何記住眾多使用者的會話資料呢?
首先要將客戶端和伺服器端建立一一聯繫,每個客戶
端都得有一個唯一標識,這樣伺服器才能識別出來。建議唯一識別的方法有兩種: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的值,保存的時候先序列化再寫入。
事實就是這
樣,所以如果伺服器不支援session或你想自訂session,完全可以DIY,透過PHP的uniqid產生永不重複的session
id,然後找個地方儲存session的內容即可,你也可以學flickr把session存放在MySQL資料庫中。
使用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沒辦法同步又想做統一登入那就太有用了。
當然還有一種方法就
是在負載平衡那一層保持會話,把訪客綁定在某個伺服器上,他的所有存取都在那個伺服器上就不需要session同步了,這些都是維運層面的東西。就說這
麼多吧,依照自己的應用選擇使用session,不要因為大家都說session影響系統效能就畏首畏尾,知道問題,解決問題才是關鍵,惹不起躲得起不適合這裡。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。