PHP开发 加入小组

298个成员 3006个话题 创建时间:2011-05-30

提问时间,关于 session

发表于 2013-02-20 3849 次查看

题目比较基础,知道的同学就略过吧,觉得不太清楚的同学可以试着解答(不清楚的一定要解答,不然开发用户登入功能就没完全搞清楚)

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

1. session 必须依赖 cookie 么?

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

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

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

延伸问题:

1. session 是在什么情况下诞生的?

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

3回复
  • 2楼 HiZhou 2013-02-26

    时间到了,自己回答。。。

     

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

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

    3、略,不清楚的必须自己画一遍流程图的。

    4、PHP 内置的 session 机制,是使用内置的 session 系列函数,并将 session 数据保存到文件中。大流量的网站,如果 web 服务器大于一台,这种机制就有问题。

    假设有 A B 两台 web 服务器,用户的请求会随机分发到这两台上,某用户请求登录时,在 A 上创建了 session 数据文件,但下一次请求被分配到 B,B 上面没有对应 session 数据文件,于是程序判断用户没有登录,于是用户认为网站出错。当然有补救的方案,同步 session 数据文件,但这复杂化了,简单的方案,应该是自己去实现 session 机制,将 session 数据保存到数据库等地方。至于数据库、数据表压力会不会太大,需要分散压力,是另一个话题。

    延伸问题:

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

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


    另外问大家个问题:

    前几天有同学说要去报培训班学习 PHP,大家怎么看?这里有多少同学对培训班有兴趣的?

  • 3楼 myth 2013-02-27

    顶下 受教了 

    下面是我的解释 找的一些资料认为是正确的

    session机制。session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。 

      当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识------------称为session id,如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。


            保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。
           经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器

  • 4楼 webclz 2014-05-27
    干活干活干活
发表回复
功能维护升级中,维护完成完后将再次开放,非常抱歉给您学习造成的不便。