php session 实现原理
PHP Session 实现原理
PHP Session 是一种在服务器端存储用户数据的机制,用于跟踪用户状态。其核心原理是通过唯一标识符(Session ID)关联客户端与服务器端的数据存储。
Session 工作流程
-
客户端请求:当用户首次访问网站时,PHP 检查请求中是否包含 Session ID(通常通过 Cookie 或 URL 传递)。若不存在,则生成一个新的 Session ID。
-
Session ID 传递:生成的 Session ID 通过响应头
Set-Cookie发送给客户端(默认名称为PHPSESSID),后续请求客户端会自动携带该 Cookie。 -
数据存储:服务器将 Session 数据以文件或其它形式(如数据库、Redis)存储在指定目录(默认在
php.ini的session.save_path配置)。文件命名格式为sess_[Session ID]。 -
数据读写:PHP 通过
$_SESSION超全局数组读写 Session 数据。脚本结束时,数据会被序列化(默认使用php格式)并保存到存储介质。
关键配置参数
session.save_handler:定义存储方式(如files、redis)。session.save_path:存储路径(如/tmp或 Redis 连接字符串)。session.name:Session Cookie 名称(默认为PHPSESSID)。session.cookie_lifetime:Session Cookie 有效期(秒)。
代码示例:手动管理 Session
// 启动 Session
session_start();
// 写入数据
$_SESSION['user_id'] = 123;
// 读取数据
$userId = $_SESSION['user_id'] ?? null;
// 销毁 Session
session_destroy();
自定义 Session 存储
通过实现 SessionHandlerInterface 可自定义存储逻辑,例如存到数据库:
class CustomSessionHandler implements SessionHandlerInterface {
public function open($savePath, $sessionName): bool {
// 初始化连接
return true;
}
public function close(): bool {
// 关闭连接
return true;
}
public function read($sessionId): string {
// 从数据库读取数据
return '';
}
public function write($sessionId, $data): bool {
// 写入数据库
return true;
}
public function destroy($sessionId): bool {
// 删除记录
return true;
}
public function gc($maxlifetime): int {
// 清理过期记录
return 0;
}
}
// 注册自定义处理器
$handler = new CustomSessionHandler();
session_set_save_handler($handler, true);
注意事项
- 安全性:Session ID 应通过 HTTPS 传输,并设置
session.cookie_secure和session.cookie_httponly。 - 性能:文件存储在高并发时可能成为瓶颈,建议使用 Redis 或 Memcached。
- 垃圾回收:通过
session.gc_probability和session.gc_divisor控制回收概率。







