首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP Session 工作原理與實戰應用詳解

     編輯:PHP 相關知識

什麼是 Session?

Session 從使用者造訪頁面開始,到斷開連線為止,形成一個會話生命週期。伺服器分配唯一 SessionID 識別使用者,並將會話資料儲存在伺服端(檔案、資料庫、快取等),客戶端僅保留 ID(通常透過 Cookie PHPSESSID 或 URL 參數傳遞)。

核心運作流程

  1. 啟動:session_start() 檢查 Cookie 中是否有 PHPSESSID,無則產生新 ID 並發送 Cookie;有則讀取對應儲存檔案並反序列化到 $_SESSION。
  2. 讀寫:腳本執行期間操作 $_SESSION 陣列,結束時自動序列化寫回儲存介質。
  3. 銷毀:session_destroy() 刪除伺服端檔案與 $_SESSION,搭配 setcookie(..., time()-3600) 刪除客戶端 Cookie。

關鍵設定參數(php.ini)

  • session.name = PHPSESSID:Cookie 名稱。
  • session.save_handler = files:儲存引擎(files/user/memcache/sqlite...)。
  • session.save_path = /tmp:檔案儲存路徑(支援 N;/path 多級目錄)。
  • session.use_cookies = 1:是否用 Cookie 傳 ID。
  • session.gc_maxlifetime = 1440:GC 最大生存秒數(預設 24 分鐘)。
  • session.gc_probability / gc_divisor:GC 啟動機率。

效能優化與分散式部署

1. 檔案系統瓶頸

單目錄檔案超過 1 萬個時定位極慢。啟用 session.save_path = "2;/path/to/session/dir" 兩級子目錄(各 16 進制 0-f),需預先建立目錄樹。

2. 小檔案 I/O 效率

建議改用 ReiserFS(現已少見)或改用記憶體/資料庫儲存。

3. 替代儲存引擎

php -i | grep "Registered save handlers" 可見支援:files, user, sqlite, eaccelerator, memcache, mmcache, MySQL, PostgreSQL 等。

4. 多伺服器 Session 同步

  • 集中式儲存:Memcached、Redis、資料庫、NFS 共享檔案目錄。
  • 加密 Cookie 傳遞:登入後將加密 Session 資料寫入 Cookie,各節點驗證 Cookie 重建 Session,適合跨機房子頻道單一登入。

實戰案例:跨系統 Session 共享

系統 A(Web)獨立運作,系統 B(Mobile)需呼叫 A 的 API 並保持登入態。

  1. 使用者在 A 登入成功,A 回傳 session_id 給 B。
  2. B 後續請求攜帶該 session_id。
  3. A 在 session_start() 前呼叫 session_id($received_id) 接管會話。

此法無需修改 A 的驗證邏輯,安全且簡潔。

常見操作速查

session_start();                 // 必須在輸出前呼叫
$_SESSION['key'] = 'value';      // 寫入
$val = $_SESSION['key'];         // 讀取
unset($_SESSION['key']);         // 刪除單一鍵
session_destroy();               // 徹底銷毀

為何必須先 session_start()?

它告知伺服器:「準備好 Cookie 與儲存檔案」(寫入時),或「根據 ID 載入資料」(讀取時)。只有 session_name() 可在其前呼叫(讀取/設定 Cookie 名稱)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved