1.php中的session生成机制我们先来分析一下PHP中session是如何生成的。设计session的目的是维护每个用户的各种状态,以弥补HTTP协议(无状态)的不足。我们现在有一个问题,我们都知道session是保存在服务器上的,既然是用来维护每个用户的状态的,那它用来区分用户有什么用呢?这时候,你就不得不使用cookies了。当我们调用session_start();代码中,PHP会在SESSION的存储目录(默认为/tmp/)和客户端的cookie目录下同时生成一个文件。session文件名是这样的:格式是sess_{SESSIONID},那么session文件中什么都没有,当我们在session_start()中加入这两行代码时:$_SESSION['name']='phper';$_SESSION['blog']='startphp.cn';此时文件内容为:name|s:5:"phper";blog|s:11:"startphp.cn";然后看cookie:yes看到服务器自动给我们生成了一个cookie,cookie名称是“PHPSESSID”,cookie内容是一串字符,其实这串字符就是{SESSIONID}。可能你已经明白,当我们使用session时,PHP会先生成一个唯一的SESSIONID号(比如2bd170b3f86523f1b1b60b55ffde0f66),然后在我们服务器的默认目录下生成一个文件,文件名为sess_{SESSIONID},同时在当前用户时间客户端生成一个cookie,内容已经声明。这样PHP就会为每个用户生成一个SESSIONID,也就是说每个用户一个session文件。当PHP第一次为用户使用会话时,它会向客户端写入一个cookie。以后用户访问时,浏览器会带上这个cookie。PHP拿到cookie后,读取里面的SESSIONID,并带着这个SESSIONID去session目录下寻找session文件。找到后,它将在调用$_SESSION['blog']时显示。2、php中的session过期恢复机制我们了解了session的产生和工作原理,发现session目录下有很多session文件。当然,这些文件一定不能永远存在,PHP必须提供过期回收机制。在php.ini中,session.gc_maxlifetime设置会话的生命周期(默认为1440秒)。如果会话文件的最后更新时间超过生存期,则认为会话文件已过期。下次会话被回收时,它将被删除。下一次会话什么时候回收?这个跟php的请求数有关。在PHP的内部机制中,当PHP被请求N次时,就会触发一次回收机制。一次触发多少个请求由以下两个参数控制:session.gc_probability=1session.gc_divisor=100这是php.ini的默认设置,也就是说每100个PHP请求就会有一个recovery。概率是gc_probability/gc_divisor。我们了解了服务器端的session过期机制,再来看客户端的cookie过期机制。如果cookie无效,浏览器自然无法将cookie发送给服务器。这时候,即使服务器的session文件存在,也是没有用的,因为PHP不知道读取哪个session文件。我们知道PHP的cookie过期时间是在创建时设置的,那么PHP在创建session时为客户端创建的cookie的生命周期是多久呢?这是在php.ini中设置的:session.cookie_lifetime。该值默认为0,即浏览器关闭后SESSIONID失效。也就是说,我们可以通过将session.gc_maxlifetime和session.cookie_lifetime设置为相同的值来控制session的过期时间。3、php中session的客户端存储机制从上面的介绍我们可以知道,如果用户关闭了cookie,那么我们的session就根本不起作用了。是的。php中session的客户端存储机制是不是只有cookie?不。由于我们的SESSIONID无法通过cookie传递给各个页面,我们还有一个法宝,就是通过页面GET传值的方式。php在禁用cookie的情况下可以自动通过GET跨页面传递SESSIONID,前提是php.ini的session.use_trans_sid设置为1。此时,当我们在客户端禁用cookie时使用session,而当当前页面被点击链接到另一个页面,PHP会自动给链接加上SESSIONID参数,像这样:nextpage.php?SESSIONID=2bd170b3f86523f1b1b60b55ffde0f66。我想您应该已经看到这种方法的缺点:它有点不安全。以上内容希望对大家有所帮助。很多PHPer在进阶的时候总会遇到一些问题和瓶颈。业务代码写多了就没有方向感。架构视频资料与大厂PHP访谈PDF|免费获取关注公众号:PHP开源社区
