跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
PHP会话变量
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
预览
高级
特殊字符
帮助
标题
2级
3级
4级
5级
格式
插入
拉丁字母
扩展拉丁字母
国际音标
符号
希腊字母
希腊字母扩展
西里尔字母
阿拉伯字母
扩展阿拉伯字母
希伯来字母
孟加拉语字符集
泰米尔数字和符号
泰卢固语字符集
僧伽罗语字符集
梵文字符集
古吉拉特语字符集
泰语字符集
老挝语
高棉语字母
加拿大原住民音节文字
卢恩
Á
á
À
à
Â
â
Ä
ä
Ã
ã
Ǎ
ǎ
Ā
ā
Ă
ă
Ą
ą
Å
å
Ć
ć
Ĉ
ĉ
Ç
ç
Č
č
Ċ
ċ
Đ
đ
Ď
ď
É
é
È
è
Ê
ê
Ë
ë
Ě
ě
Ē
ē
Ĕ
ĕ
Ė
ė
Ę
ę
Ĝ
ĝ
Ģ
ģ
Ğ
ğ
Ġ
ġ
Ĥ
ĥ
Ħ
ħ
Í
í
Ì
ì
Î
î
Ï
ï
Ĩ
ĩ
Ǐ
ǐ
Ī
ī
Ĭ
ĭ
İ
ı
Į
į
Ĵ
ĵ
Ķ
ķ
Ĺ
ĺ
Ļ
ļ
Ľ
ľ
Ł
ł
Ń
ń
Ñ
ñ
Ņ
ņ
Ň
ň
Ó
ó
Ò
ò
Ô
ô
Ö
ö
Õ
õ
Ǒ
ǒ
Ō
ō
Ŏ
ŏ
Ǫ
ǫ
Ő
ő
Ŕ
ŕ
Ŗ
ŗ
Ř
ř
Ś
ś
Ŝ
ŝ
Ş
ş
Š
š
Ș
ș
Ț
ț
Ť
ť
Ú
ú
Ù
ù
Û
û
Ü
ü
Ũ
ũ
Ů
ů
Ǔ
ǔ
Ū
ū
ǖ
ǘ
ǚ
ǜ
Ŭ
ŭ
Ų
ų
Ű
ű
Ŵ
ŵ
Ý
ý
Ŷ
ŷ
Ÿ
ÿ
Ȳ
ȳ
Ź
ź
Ž
ž
Ż
ż
Æ
æ
Ǣ
ǣ
Ø
ø
Œ
œ
ß
Ð
ð
Þ
þ
Ə
ə
格式
链接
标题
列表
文件
讨论
参考
说明
输入内容
输出结果
斜体
''斜体文字''
斜体文字
粗体
'''粗体文字'''
粗体文字
粗斜体
'''''粗斜体文字'''''
粗斜体文字
说明
输入内容
输出结果
参考资料
页面文本。<ref>[https://www.example.org/ 链接文本],其他文本。</ref>
页面文本。
[1]
命名参考资料
页面文本。<ref name="测试">[https://www.example.org/ 链接文本]</ref>
页面文本。
[2]
复用参考资料
页面文本。<ref name="测试" />
页面文本。
[2]
显示参考资料列表
<references />
↑
链接文本
,其他文本。
↑
链接文本
{{DISPLAYTITLE:PHP会话变量}} '''PHP会话变量'''(PHP Session Variables)是PHP中用于在多个页面请求间存储用户特定数据的机制。会话通过唯一的会话ID标识用户,数据默认存储在服务器端,而客户端仅保存会话ID(通常通过Cookie或URL传递)。本文详细介绍会话的工作原理、使用方法及实际应用场景。 == 概述 == 会话(Session)解决了HTTP协议无状态的问题,允许服务器在用户浏览网站期间持续跟踪其状态。当会话启动时,PHP会: # 生成唯一会话ID # 在服务器端创建关联的数据文件 # 通过Cookie(默认)或URL将会话ID发送给客户端 关键区别: * '''Cookie''':数据存储在客户端,有大小限制(约4KB),安全性较低。 * '''Session''':数据存储在服务器端,仅会话ID在客户端传递,更安全。 == 基本用法 == === 启动会话 === 使用<code>session_start()</code>初始化会话,必须在输出任何内容前调用: <syntaxhighlight lang="php"> <?php // 启动会话 session_start(); // 设置会话变量 $_SESSION['username'] = 'php_learner'; $_SESSION['last_visit'] = time(); echo "会话已启动,数据已存储。"; ?> </syntaxhighlight> '''输出''': <pre> 会话已启动,数据已存储。 </pre> === 访问会话数据 === 在同一会话的其他页面中: <syntaxhighlight lang="php"> <?php session_start(); // 访问会话变量 echo "用户名: " . $_SESSION['username'] . "<br>"; echo "上次访问: " . date('Y-m-d H:i:s', $_SESSION['last_visit']); ?> </syntaxhighlight> '''输出''': <pre> 用户名: php_learner 上次访问: 2023-05-15 14:30:22 </pre> === 销毁会话 === 清除会话数据并终止会话: <syntaxhighlight lang="php"> <?php session_start(); // 清除所有会话变量 $_SESSION = array(); // 删除会话Cookie if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"] ); } // 销毁会话 session_destroy(); echo "会话已销毁。"; ?> </syntaxhighlight> == 工作原理 == <mermaid> sequenceDiagram participant Client participant Server Client->>Server: 首次请求(无会话ID) Server->>Client: 生成会话ID(Set-Cookie头) Client->>Server: 后续请求(携带会话ID) Server->>Server: 根据ID读取/写入会话数据 </mermaid> 数学表示会话ID与数据的映射关系: <math>\text{SessionData} = f(\text{SessionID})</math> == 配置选项 == 通过<code>php.ini</code>或运行时函数配置: {| class="wikitable" |+ 常用会话配置 ! 参数 !! 描述 !! 默认值 |- | <code>session.save_path</code> || 会话文件存储路径 || <code>/tmp</code> |- | <code>session.cookie_lifetime</code> || Cookie有效期(秒) || <code>0</code>(浏览器关闭失效) |- | <code>session.gc_maxlifetime</code> || 会话数据存活时间(秒) || <code>1440</code> |} 运行时配置示例: <syntaxhighlight lang="php"> ini_set('session.cookie_lifetime', 86400); // 1天有效期 ini_set('session.gc_maxlifetime', 86400); </syntaxhighlight> == 安全实践 == 1. '''会话固定防护''':在登录时重置会话ID <syntaxhighlight lang="php"> session_regenerate_id(true); </syntaxhighlight> 2. '''HTTPS传输''':防止会话劫持 <syntaxhighlight lang="php"> ini_set('session.cookie_secure', 1); </syntaxhighlight> 3. '''HTTP Only Cookie''': <syntaxhighlight lang="php"> ini_set('session.cookie_httponly', 1); </syntaxhighlight> == 实际案例 == === 用户登录系统 === <syntaxhighlight lang="php"> <?php session_start(); // 模拟验证 if ($_POST['username'] === 'admin' && $_POST['password'] === 'secret') { $_SESSION['authenticated'] = true; $_SESSION['user_role'] = 'administrator'; header('Location: dashboard.php'); exit; } else { echo "登录失败"; } ?> </syntaxhighlight> '''dashboard.php'''中检查认证: <syntaxhighlight lang="php"> <?php session_start(); if (!isset($_SESSION['authenticated']) || !$_SESSION['authenticated']) { header('HTTP/1.0 403 Forbidden'); exit('拒绝访问'); } echo "欢迎, ". $_SESSION['user_role']; ?> </syntaxhighlight> == 高级主题 == === 自定义会话处理器 === 实现将会话数据存储到数据库: <syntaxhighlight lang="php"> class DatabaseSessionHandler implements SessionHandlerInterface { private $pdo; public function __construct(PDO $pdo) { $this->pdo = $pdo; } public function open($savePath, $sessionName): bool { return true; } public function close(): bool { return true; } public function read($id): string { $stmt = $this->pdo->prepare("SELECT data FROM sessions WHERE id = ?"); $stmt->execute([$id]); return $stmt->fetchColumn() ?: ''; } public function write($id, $data): bool { $stmt = $this->pdo->prepare( "REPLACE INTO sessions (id, data, last_accessed) VALUES (?, ?, ?)" ); return $stmt->execute([$id, $data, time()]); } public function destroy($id): bool { $stmt = $this->pdo->prepare("DELETE FROM sessions WHERE id = ?"); return $stmt->execute([$id]); } public function gc($maxlifetime): bool { $stmt = $this->pdo->prepare( "DELETE FROM sessions WHERE last_accessed < ?" ); return $stmt->execute([time() - $maxlifetime]); } } // 使用示例 $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass'); $handler = new DatabaseSessionHandler($pdo); session_set_save_handler($handler, true); session_start(); </syntaxhighlight> == 常见问题 == '''Q: 会话数据在哪里存储?''' A: 默认存储在服务器临时目录(<code>session.save_path</code>),可通过自定义处理器存储到数据库/Redis等。 '''Q: 如何解决"Headers already sent"错误?''' A: 确保在调用<code>session_start()</code>前没有输出(包括空格和BOM头)。 '''Q: 会话与Cookie的关系?''' A: 会话通常依赖Cookie存储会话ID,但也可通过URL传递(设置<code>session.use_trans_sid=1</code>)。 == 总结 == PHP会话变量是构建有状态Web应用的核心工具。关键要点: * 使用<code>$_SESSION</code>超全局数组存取数据 * 始终先调用<code>session_start()</code> * 注意安全配置(HTTPS、HttpOnly、会话固定防护) * 可扩展存储机制满足不同需求 通过合理使用会话,开发者能创建个性化的用户体验,如购物车、用户认证系统等交互功能。 [[Category:编程语言]] [[Category:PHP]] [[Category:PHP会话与cookie]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)