什么是 Session
在 web
应用开发中,Session 被称为会话。主要被用于保存某个访问者的数据。
由于 HTTP
无状态的特点,服务端是不会记住客户端的,对服务端来说,每一个请求都是全新的。
既然如此,那么服务端怎么知道是哪个访问者在请求它呢?又如何将不同的数据对应上正确的访问者?答案是,给访问者一个唯一获取 Session
中数据的身份标识。
打个比方:当我们去超市购物时,被保安告之我们是不能带物品进去的,必须将物品寄放在超市的储物箱中。我们把物品交给了他,他怎么知道这些物品谁是谁的,于是他给了我们不同的钥匙。当我们要取走我们的物品时,用唯一的钥匙打开对应的箱子即可。
就如同上面的比方一样,可以将 Session
理解为存放我们数据的“箱子”,当然,这些“箱子”都在服务端那。服务器给访问者唯一的“钥匙”,这个“钥匙”被称作 session_id。访问者凭借自己的 session_id,就能获取到自己存在服务器端的数据。
session_id通过两种方式传给访问者(客户端):URL或 Cookie。详情参见:传送会话ID
Session 和 Cookie
有什么关系
Cookie 也是由于
HTTP 无状态的特点而产生的技术。也被用于保存访问者的身份标识和一些数据。每次客户端发起 HTTP 请求时,会将 Cookie
数据加到 HTTP header 中,提交给服务端。这样服务端就可以根据 Cookie 的内容知道访问者的信息了。
可以说,Session 和
Cookie 做着相似的事情,只是 Session 是将数据保存在服务端,通过客户端提交来的 session_id
来获取对应的数据;而 Cookie 是将数据保存在客户端,每次发起请求时将数据提交给服务端的。
上面提到,session_id 可以通过 URL 或 cookie 来传递,由于 URL 的方式比 cookie
的方式更加不安全且使用不方便,所以一般是采用 cookie 来传递 session_id。
服务端生成
session_id,通过 HTTP 报文发送给客户端(比如浏览器),客户端收到后按指示创建保存着 session_id 的
cookie。cookie 是以 key/value 形式保存的,看上去大概就这个样子的:
PHPSESSID=e4tqo2ajfbqqia9prm8t83b1f2
在 PHP 中,保存
session_id 的 cookie 名称默认叫作 PHPSESSID,这个名称可以通过 php.ini 中 session.name 来修改,也可以通过函数 session_name() 来修改。
为什么不推荐使用 PHP 自带的 files 型
Session 处理器
在 PHP 中,默认的
Session 处理器是 files,处理器可以用户自己实现(参见:自定义会话管理器)。我知道的成熟的 Session
处理器还有很多:Redis、Memcached、MongoDB……为什么不推荐使用 PHP 自带的 files
类型处理器,PHP 官方手册中给出过这样一段 Note:
无论是通过调用函数 session_start()
手动开启会话, 还是使用配置项 session.auto_start 自动开启会话, 对于基于文件的会话数据保存(PHP
的默认行为)而言, 在会话开始的时候都会给会话数据文件加锁, 直到 PHP
脚本执行完毕或者显式调用 session_write_close() 来保存会话数据。
在此期间,其他脚本不可以访问同一个会话数据文件。
为了证明这段话,我们创建一下 2 个文件:
文件:session1.php
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。