PHP 會話跟蹤基礎(一):什麼是會話控制與 Session 概念
HTTP 協議是無狀態的,每次請求相互獨立。為了在多次請求間識別同一用戶、保持登錄狀態、購物車數據等,必須引入會話控制機制。本文作為系列首篇,建立會話控制的核心概念框架。
什麼是會話控制
會話控制 是一種強有力的解決方案,使 Web 應用能夠跟蹤客戶端與服務器之間的交互歷程,保存並記住每個用戶的身份標識與業務數據,從而在無狀態的 HTTP 之上構建有狀態的用戶體驗。
核心痛點
- 用戶登錄後,跳轉新頁面如何知道「是同一個人」?
- 購物車添加商品,刷新頁面如何不丟失數據?
- 多標籤頁操作,如何同步狀態?
兩大主流實現技術
| 技術 | 存儲位置 | 標識傳遞 | 生命周期 | 安全性 | 典型場景 |
| Cookie | 客戶端瀏覽器 | HTTP Header 自動攜帶 | 可設定過期時間 (持久/會話級) | 可被竄改/盜取,不可存敏感數據 | 記住我、偏好設置、追蹤標識 |
| Session | 服務端 (文件/Redis/DB) | Session ID 通過 Cookie/URL 傳遞 | 瀏覽器關閉或服務端 GC 過期 | 數據在服務端,相對安全 | 用戶登錄態、權限、購物車、表單令牌 |
Session 工作原理
- 用戶首次訪問,服務端生成唯一
session_id,創建會話文件/數據庫記錄。
- 服務端通過
Set-Cookie: PHPSESSID=abc123 將 ID 種植到瀏覽器。
- 後續請求瀏覽器自動攜帶
Cookie: PHPSESSID=abc123。
- PHP 讀取 ID,加載對應會話數據到
$_SESSION 超全局陣列。
- 腳本結束時,將
$_SESSION 變更寫回存儲介質。
PHP Session 基礎 API
<?php
// 1. 啟動會話 (必須在輸出前調用)
session_start();
// 2. 讀寫會話數據
$_SESSION['user_id'] = 1001;
$_SESSION['username'] = 'Alice';
echo $_SESSION['username']; // Alice
// 3. 檢查會話變量
if (isset($_SESSION['user_id'])) { /* 已登錄 */ }
// 4. 銷毀單個變量
unset($_SESSION['username']);
// 5. 銷毀整個會話 (登出)
session_destroy(); // 刪除服務端存儲
session_unset(); // 清空 $_SESSION 陣列
// 建議同時清除 Cookie
setcookie(session_name(), '', time()-3600, '/');
?>
關鍵配置 (php.ini)
| 配置項 | 默認值 | 說明 |
| session.save_handler | files | 存儲引擎:files/redis/memcached/custom |
| session.save_path | /tmp | 文件存儲路徑 (需寫權限) |
| session.gc_maxlifetime | 1440 (秒) | 會話數據最大生存時間,GC 依據 |
| session.cookie_lifetime | 0 | Cookie 生命周期,0=瀏覽器關閉即失效 |
| session.use_strict_mode | Off | 嚴格模式拒絕未初始化的 session_id |
| session.cookie_httponly | On | 禁止 JS 讀取 Cookie (防 XSS) |
| session.cookie_secure | Off | 僅 HTTPS 傳輸 Cookie (生產必開) |
下一篇預告
系列第二篇將深入講解 Session 進階配置、分布式 Session 方案 (Redis/Memcached)、Session 固定攻擊防範、自定義 SessionHandler 實現。
理解會話控制本質是「在無狀態協議上構建有狀態上下文」,是 Web 開發進階的必修課。
- 上一篇文章: PHPCMS 手機端內容頁新增上一篇/下一篇導航實現方法
- 下一篇文章: PHP 會話跟蹤進階(二):Session 深度配置與分布式方案
Copyright ©
程式碼之家 All Rights Reserved