定义
- 会话在 PHP 中是在并发访问时由一个方法来保存某些数据。从而使你能够构建更多的定制程序从而提高你的 web 网站的吸引力。
- PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。
开发原因
-
在计算机上操作某个应用程序时,打开它,做些更改,然后关闭它。这很像一次对话(Session)。计算机知道您是谁。它清楚您在何时打开和关闭应用程序。然而,在因特网上问题出现了:由于HTTP地址无法保持状态,Web服务器并不知道您是谁以及您做了什么。
-
PHP session 解决了这个问题,它通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。然而,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中。
工作机制
- 为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。
工作流程
- 从请求中查找会话ID(传递到服务器的会话cookie),如果请求中不包含,创建一个新的会话;
- 当一个session第一次被启用时,一个独一的标识被存储于本地的cookie中。
- web server 为用户创建一个唯一的 session对象
- 把用户信息存储到 PHP session 中之前,首先必须启动会话。调用session_start() 函数(必须位于 < html > 标签之前)
- 注册会话变量到 $_SESSION() 中,或调用会话变量
- 当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。
查询 - 启用 - 注册 - 存储
作用
- 会话通常被用来在多个页面请求之间保存及共享信息。
- 用户登陆之后,整个网站都可以访问,对于应用程序中的所有页面都是可用的。
作用时间
- Session的作用时间从用户到达某个特定的Web页开始,到该用户离开Web站点,或在程序中利用代码终止某个Session结束。引用Session 则可以让一个用户访问多个页面之间的切换也会保留该用户的信息。
session与cookie的区别
- 相同点:都使用cookie存储一些信息,前者是sessionID,后者是cookie变量的值
- 不同点:
sessionID 存储在 客户端,但 session变量 存储在 服务器端 的内存(定太多影响服务器的性能)
cookie 只在 客户端 存储(定义再多也不影响服务器的性能)
相关配置(php.ini)
- 会话管理器:PHP为sesion的存储提供了三种方式:文件/ 内存/ 自定义存储,默认是使用文件存储;
- session会话数据的存储路径:文件名以 sess_ 为前缀,后跟 SESSION ID
- 使用cookie保存sessionid
- 会话名字:保存在cookie里的session名字
- 启动机制:不自动开启session
- 会话有效期是直到浏览器重启
- SESSION的数据格式:使用较旧的序列化处理器导致 $ _SESSION 的索引既不能是数字也不能包含特殊字符(l and !)。使用 php_serialize 避免脚本退出时,数字及特殊字符索引导致出错。
序列化:把数据变为永久存储格式或可传输格式
反序列化:把数据还原到变量中
会话方法
- 启动会话: session_start()
启动新会话或者重用现有会话
- 会话变量的注册:$ _ session()
- 主动保存会话数据: session_write_close()
对于基于文件的会话数据保存(PHP 的默认行为)而言, 在会话开始的时候都会给会话数据文件加锁, 直到 PHP 脚本执行完毕或者显式调用 session_write_close() 来保存会话数据。 在此期间,其他脚本不可以访问同一个会话数据文件。
- 释放会话变量: session_unset()
session_unset () — 释放所有的会话变量
session_destroy () — 销毁一个会话中的全部数据
setcookie () — 删除客户端的会话 cookie