just do it

关于session那些事之基础

在 PHP 的开发中,在做类似会员登入的功能时,会用到 session(会话),下面是关于 session 的几个问题:

1. session 必须依赖 cookie 么?

答:session 不依赖 cookie,使用 cookie 是为了保存 sessionId,把 sessionId 附在url、或者放在表单中,请求时,服务器也能得到 sessionId,不过使用 cookie 会方便的多。

2. session 的数据必须存在文件中么?

答:session 的数据能放在很多地方,文件、数据库、缓存,等等,只要能持久化就行,PHP 默认采用文件方式保存 session 的数据是因为实现简单、所有环境都支持,能演示出效果。

3. 使用 PHP 内置的 session 机制,创建一个 session 的流程是怎样的?下一个访问,客户端得到自己的 session 的流程是怎样的?

答:

《关于session那些事之基础》

4. 大流量网站,能直接使用 PHP 内置的 session 机制么?

答:PHP 内置的 session 机制,是使用内置的 session 系列函数,并将 session 数据保存到文件中。大流量的网站,如果 web 服务器大于一台,这种机制就有问题。假设有 A B 两台 web 服务器,用户的请求会随机分发到这两台上,某用户请求登录时,在 A 上创建了 session 数据文件,但下一次请求被分配到 B,B 上面没有对应 session 数据文件,于是程序判断用户没有登录,于是用户认为网站出错。当然有补救的方案,同步 session 数据文件,但这复杂化了,简单的方案,应该是自己去实现 session 机制,将 session 数据保存到数据库等地方。至于数据库、数据表压力会不会太大,需要分散压力,是另一个话题。简单的也可以利用memcache集群问题解决。

延伸问题:
1. session 是在什么情况下诞生的?

答:印象中,是因为用 cookie 保存用户数据有安全问题,因为 cookie 是客户端的,然后就折腾出了 session。

2. 在线用户列表是怎么实现的?

答:将用户的 session 数据结构化的保存起来,并能够索引,比如建立表结构、每个用户的 session 数据存为一条记录。

点赞