PHP Session的工作原理和儲存機制

2020-07-16 10:05:13
Session 是通過一個名為 PHPSESSID 的 Cookie 來和伺服器取得聯絡的,Session 通過 sessionID(PHPSESSID 的值)來找到對應伺服器中 Session 的檔名。

sessionID 是在用戶端和伺服器端通過 HTTP Requset 和 HTTP Response 傳來傳去的。sessionID 按照一定的演算法生成,保證其值的唯一性和隨機性。

Cookie 裡儲存著 Session 的 sessionID 和 Session 的生存期,如果沒有設定 Session 的生存期,則 sessionID 儲存在記憶體中,關閉瀏覽器時 Session 失效,重新請求頁面時會重新註冊一個 sessionID。

預設情況下,Session 是儲存在伺服器硬碟上的,在 php.ini 中可通過 session.save_path 設定 Session 檔案的儲存路徑,預設為伺服器上的 /tmp 目錄。

session.save_path 設定指令還有一個可選的 N 引數來決定對談檔案分布的目錄深度,例如設定為'5;/tmp'將使建立的對談檔案和路徑類似於下面的形式:

/tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If

要使用 N 引數,必須在使用前先建立好這些目錄。在 ext/session 目錄下有個小的 shell 指令碼,即 mod_files.sh。Windows 版本下的 mod_files.bat 可以用來做這件事。

此外,如果使用了 N 引數並且大於 0,那麼將不會執行自動垃圾回收。檔案儲存模組預設使用 mode 600 建立檔案。通過修改可選引數 MODE 來改變這種預設行為:

N;MODE;/path

其中,MODE 是 mode 的八進位制表示。

使用以上描述的可選目錄層級引數 N 時請注意,對於絕大多數站點,大於 1 或者 2 的值會不太合適——因為這需要建立大量的目錄。例如,值設定為 3 需要在檔案系統上建立 64^3 個目錄,將浪費很多空間和 inode。僅僅在絕對肯定站點足夠大時才可以設定 N 大於 2。

一個 Session 檔案的內容如下:

siteadmin_username|s:7:"special";siteadmin_truename|s:6:"特殊";siteadmin_usertype|i:1;

內容的格式為:

session 名 | 值型別 : 長度 : 值;