php中Session的生成机制、回收机制和存储机制探究

 更新时间:2014年08月19日 09:37:05   投稿:junjie  
这篇文章主要介绍了php中Session的生成机制、回收机制和存储机制探究,可以帮助大家对Session有一个全面的了解,需要的朋友可以参考下

1、php中session的生成机制

我们先来分析一下PHP中是怎么生成一个session的。设计出session的目的是保持每一个用户的各种状态来弥补HTTP协议的不足(无状态)。我们现在有一个疑问,我们都知道session是保存在服务器的,既然它用于保持每一个用户的状态那它利用什么来区别用户的呢?这个时候就得借助cookie了。当我们在代码中调用session_start();时,PHP会同时往SESSION的存放目录(默认为/tmp/)和客户端的cookie目录各生成一个文件。session文件名称像这样:

格式为sess_{SESSIONID} ,这时session文件中没有任何内容,当我们在session_start();添加了这两行代码:

复制代码 代码如下:

$_SESSION['name'] = 'wanchun0222';

$_SESSION['blog'] = 'coderbolg.net';


这时文件就有内容了:
复制代码 代码如下:

name|s:11:"wanchun0222";blog|s:13:"coderbolg.net";

这时再看看cookie:

可以看到服务器为我们自动生成了一个cookie,cookie名称为"PHPSESSID",cookie内容是一串字符,其实这串字符就是{SESSIONID}。也许你已经明白了,当我们使用session时,PHP就先生成一个唯一的SESSIONID号(如2bd170b3f86523f1b1b60b55ffde0f66),再在我们服务器的默认目录下生成一个文件,文件名为sess_{SESSIONID},同时在当前用户的客户端生成一个cookie,内容已经说过了。这样PHP会为每一个用户生成一个SESSIONID,也就是说一个用户一个session文件。PHP第一次为某个用户使用session时就向客户端写入了cookie,当这个用户以后访问时,浏览器会带上这个cookie,PHP在拿到cookie后就读出里面的SESSIONID,拿着这个SESSIONID去session目录下找session文件。找到后在调用$_SESSION['blog']的时候显示出来。

2、php中session的过期回收机制

我们明白了session的生成及工作原理,发现在session目录下会有许多session文件。当然这些文件一定不是永远存在的,PHP一定提供了一种过期回收机制。在php.ini中session.gc_maxlifetime为session设置了生存时间(默认为1440s)。如果session文件的最后更新时间到现在超过了生存时间,这个session文件就被认为是过期的了。在下一次session回收的时候就会被删除。那下一次session回收是在什么时候呢?这和php请求次数有关的。在PHP内部机制中,当php被请求了N次后就会有一次触发回收机制。到底是请求多少次触发一次是通过以下两个参数控制的:

复制代码 代码如下:

session.gc_probability = 1

session.gc_divisor = 100


这是php.ini的默认设置,意思是每100次PHP请求就有一次回收发生。概率是 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。我想你应该看到了这种方式的缺点:好像不够安全啊。

相关文章

  • PHP对XML内容进行修改和删除实例代码

    PHP对XML内容进行修改和删除实例代码

    这篇文章给大家主要介绍了利用PHP对XML内容进行修改和删除的原理和方法,文中通过示例代码介绍的很详细,相信对大家的理解和学习很有帮助,感兴趣的朋友们可以参考借鉴,下面来一起看看吧。
    2016-10-10
  • php cli模式下获取参数的方法

    php cli模式下获取参数的方法

    本篇文章主要介绍了php cli模式下获取参数的方法,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-05-05
  • PHP 通过Socket收发十六进制数据的实现代码

    PHP 通过Socket收发十六进制数据的实现代码

    以下是对PHP中通过Socket收发十六进制数据的实现代码进行了分析介绍。需要的朋友可以过来参考下
    2013-08-08
  • PHP操作文件的一些基本函数使用示例

    PHP操作文件的一些基本函数使用示例

    这篇文章主要介绍了PHP操作文件的一些基本函数使用示例,本文给出了复制文件、删除文件、重命名文件、截取文件等操作代码实例,需要的朋友可以参考下
    2014-11-11
  • PHP防止图片盗用(盗链)的方法小结

    PHP防止图片盗用(盗链)的方法小结

    这篇文章主要介绍了PHP防止图片盗用(盗链)的方法,结合实例形式分析了php通过修改Apache服务器配置及目录访问权限等方式实现图片防盗链的相关操作技巧,需要的朋友可以参考下
    2016-11-11
  • PHP面向对象之里氏替换原则简单示例

    PHP面向对象之里氏替换原则简单示例

    这篇文章主要介绍了PHP面向对象之里氏替换原则,结合实例形式分析了php里氏替换原则的概念、原理、简单使用方法及相关注意事项,需要的朋友可以参考下
    2018-04-04
  • 解析Extjs与php数据交互(增删查改)

    解析Extjs与php数据交互(增删查改)

    本篇文章是对Extjs与php数据交互(增删查改)进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • PHP操作Redis数据库常用方法示例

    PHP操作Redis数据库常用方法示例

    这篇文章主要介绍了PHP操作Redis数据库常用方法,结合实例形式总结分析了php针对redis数据库连接、字符串、列表、hash字典、set集合等数据类型相关操作技巧,需要的朋友可以参考下
    2018-08-08
  • 老版本PHP转义Json里的特殊字符的函数

    老版本PHP转义Json里的特殊字符的函数

    本文给大家分享的是一则在老版本的php里使用的PHP转义Json里的特殊字符的函数,虽然不是很实用了,但还是记录一下,有需要的小伙伴可以参考下。
    2015-06-06
  • PHP+Oracle本地开发环境搭建方法详解

    PHP+Oracle本地开发环境搭建方法详解

    在本篇文章中小编给大家分享了关于PHP+Oracle本地开发环境搭建的步骤和技巧,需要的朋友们学习下。
    2019-04-04

最新评论