文/michaelgbw
之前,对于session,只知道session与cookie的区别在于:session是保存在服务器端,cookie保存在客户端。session怎么样保存的?以文件的形式保存。对应session的id号模糊不清。在开发中,非常有必要弄明白具体细节。不能停留在使用session_start()函数了,然后获取session值。不知道里面的机制,在开发中遇到了新的问题,解决起来比较费心。
之前错误的session理解
传说中,Web应用程序中的Session和Application保存服务器端,而cookie保存在客户端。
其实是Session同时存在于客户端与服务器端。
我们可以打开浏览器一探究竟
<?php
@session_start();
$_SEESION['test']='test';
print_r($_SEESION);
?>
我们可以发现一个PHPSESSID的东西,创建Session的时候,服务器将生成一个唯一的sessionid然后用它生成一个关闭浏览器就会失效的cookie。
之前知道session是根据文件存储的,可究竟在哪呢?我们打开php.ini,查找session.save_path = "XXXX",看起来这个好像是路径的样子
哈哈,我们找到了对应的关系,即sess_PHPSESSID
为什么是PHPSESSID呢?我们再打开php.ini
php.ini的文档还是对于用户蛮友好的嘛,下面我们为了理解到底是怎么生成那个文件的,我们把当前页面的PHPSESSID删掉,然后f5,
新生成了一个session,文件夹里也多了个文件。我是这样理解的:session_start,可以看成是创建一个session文件。假如有原来的session文件,或许没有创建。引入一个。往session文件中写值,那是代码“$SESSION['']=" "; 赋值所完成的操作。session_start()生成一个新的session文件名时。会判断是否存在cookie名为PHPSESSID的值。如果存在,那么就会按照它的值,组合成一个文件名"sess[phpcookie值]"。所以,在目录下,老是能够看到之前删除过的session文件名。
还就那么多的session,不能老存着呀,
session.gc_divisor 与 session.gc_probability 合起来定义了在每个会话初始化时启动 gc(garbage collection 垃圾回收)进程的概率。此概率用 gc_probability/gc_divisor 计算得来。例如 1/1000 意味着在每个请求中有 0.1% 的概率启动 gc 进程.
那么如果是大型网站呢?或者存在二级域名间的跨域问题可以使用session_set_save_handler()来接管一起session活动,
对于更深层次的理解我借鉴了这个文章http://www.jb51.net/article/26890.htm 推荐下~