SESSION会话开启时,会首先发送一个对浏览器的唯一标识session_id的cookie(名字为PHPSESSID可以通过session_name,同session.save_handler
= files的情况下,在服务器的指定目录下生成一个没有后缀的文件,名字是复制代码 代码如下: ‘sess_” + ‘session_id’;
这样就完成了基本的设置。那么在下一次发起http请求时,首先浏览器会发送这个当前域名下的所有cookie名字和值过去,这样服务器就能根据cookie中的session_id来去读取session文件,而不会混淆这个session属于谁。
这一步具体如下:
SESSION发送一个对浏览器的唯一cookie变量session_id,这个session_id变量有名字、有值。变量名默认为PHPSESSID,变量值为apach随机生成的字符串,类似rvag9m368vim7k8g4v7k2ank70
。通常说的session_id其实是指这个唯一的字符串rvag9m368vim7k8g4v7k2ank70。
具体的在FF的HTTP响应头下如此: session_start();
在程序中上面一句就完成了上面的功能,假如浏览器没有发送PHPSESSID的cookie过来就发送一个过去,有就读取这个cookie,这样就能维持同一个会话。
好了既然知道了session的工作原理,那么我们可以推测到假如服务器端sess_rvag9m368vim7k8g4v7k2ank70
这个文件我们手动删除了,那么session失效,假如浏览器cookie失效,那么session照样失效。
在手动的情况下: 在服务器端,可以用 session_ destroy 来使其失效。
在浏览器端: 可以直接 ?setcookie;
让cookie过期,或者另外一种方式,但不能立即失效
?session_set_cookie_params;//当前时间戳上的秒,例如60,即让其60秒后过期,不要用时间戳+自己设定的时间。
上面所讲的都是让session提前过期,但是想直接让session延迟行不行呢?除了修改配置(session.gc_maxlifetime)是不行的,在php.ini里面session.gc_maxlifetime
设置过期时间,到了这个时间,就有session.gc_probability
/session.gc_divisor的概率被回收。假如到了这个时间,并且启动了GC进程,GC会去读取session文件的修改时间,发现大于和当前时间相减后大于session.gc_maxlifetime
,立刻删除。到此,我们也就明白了如何保持这个会话呢,只能在session.gc_maxlifetime
内,必须有用户在访问,每次访问都去修改下session,这样就这个session又多出session.gc_maxlifetime的存活时间。
另外说一下session.cookie_lifetime
,设置PHPSESSID在浏览器的存活时间,默认为0,IE下我发现是正常的,浏览器重启即cookie失效;FF下还继续存在。设置session.cookie_lifetime可以用session_set_cookie_params,
?session_set_cookie_params;//60 s session_start();
session.gc_maxlifetime和session.cookie_lifetime

最近在网上的交流中发现大家对SESSION的使用上有很多误区,本质上就是不了解SESSION的工作原理。

PHP开发过程中,可能有朋友经常会遇到Session所产生的文件无法自动清除的问题,其实并非真的无法清除,而是有一个概率问题,只要你的站点访问量足够大,那些文件就可以自动被清除掉。如果访问量比较少,又看那些文件不顺眼的话,只要在php.ini里的配置一下即可实现Session文件自动清除的功能,具体配置如下:

共同决定了session的生存时间。

刚刚找了一下firefox cookie会话过期的资料,发现如下 This is apparently by
design. Check out this Bugzilla
bug: Firefox has a
feature where you close Firefox and it offers to save all your tabs, and
then you restore the browser and those tabs come back. That’s called
session restore. What I didn’t realize is that it’ll also restore all
the session cookies for those pages too! It treats it like you had never
closed the browser. This makes sense in the sense that if your browser
crashed you get right back to where you were, but is a little
disconcerting for web devs used to session cookies getting cleared. I’ve
got some old session cookies from months ago that were set by sites I
always have open in tabs. To test this out, close all the tabs in your
browser, then close the browser and restart it. I think the session
cookies for your site should clear in that case. Otherwise you’d have to
turn off session restore.
这是火狐的会话保存功能,FF设计就是如此。可以做这个close all the tabs in
your browser, then close the browser and restart
it测试,看看是否还保存着。

SESSION会话开启时,会首先发送一个对浏览器的唯一标识session_id的cookie(名字为PHPSESSID可以通过session_name()获取),同session.save_handler

files的情况下,在服务器的指定目录(如temp)下生成一个没有后缀的文件,名字是

?’sess_” + ‘session_id’;

图片 1

这样就完成了基本的设置。那么在下一次发起http请求时,首先浏览器会发送这个当前域名下的所有cookie名字和值过去,这样服务器就能根据cookie中的session_id来去读取session文件,而不会混淆这个session属于谁。

图片 2

这一步具体如下:

SESSION发送一个对浏览器的唯一cookie变量session_id,这个session_id变量有名字、有值。变量名(name)默认为PHPSESSID,变量值(value)为apach随机生成的字符串,类似rvag9m368vim7k8g4v7k2ank70
。通常说的session_id其实是指这个唯一的字符串rvag9m368vim7k8g4v7k2ank70。

具体的在FF的HTTP响应头下如此:

?session_start();

 在程序中上面一句就完成了上面的功能,假如浏览器没有发送PHPSESSID的cookie过来就发送一个过去,有就读取这个cookie,这样就能维持同一个会话。

 

好了既然知道了session的工作原理,那么我们可以推测到假如服务器端sess_rvag9m368vim7k8g4v7k2ank70
这个文件我们手动删除了,那么session失效,假如浏览器cookie失效,那么session照样失效。

在手动的情况下:

在服务器端,可以用

?session_ destroy() 或者session_ unset()

  来使其失效。

在浏览器端:

可以直接

?setcookie(‘PHPSESSID’,”,123);

  让cookie过期,或者另外一种方式,但不能立即失效

?session_set_cookie_params($time);//当前时间戳上的秒,例如60,即让其60秒后过期,<SPAN
style=”COLOR: #ff0000″>不要用时间戳+自己设定的时间。 </SPAN>

  上面所讲的都是让session提前过期,但是想直接让session延迟行不行呢?除了修改配置(session.gc_maxlifetime)是不行的,在php.ini里面session.gc_maxlifetime
设置过期时间,到了这个时间,就有session.gc_probability
/session.gc_divisor的概率被回收。假如到了这个时间,并且启动了GC进程,GC会去读取session文件的修改时间(mtime),发现大于和当前时间相减后大于session.gc_maxlifetime
,立刻删除。到此,我们也就明白了如何保持这个会话呢,只能在session.gc_maxlifetime
内,必须有用户在访问,每次访问都去修改下session,这样就这个session又多出session.gc_maxlifetime的存活时间。

另外说一下session.cookie_lifetime
,设置PHPSESSID在浏览器的存活时间,默认为0,IE下我发现是正常的,浏览器重启即cookie失效;FF下还继续存在。设置session.cookie_lifetime可以用session_set_cookie_params,

?session_set_cookie_params(60);//60 s session_start();

session.gc_maxlifetime和session.cookie_lifetime
共同决定了session的生存时间。

举例来说明:
  第一页:
  

 代码如下

  <?php
    page_open(array(“sess” => “Test _Session”));
    $sess->register( “welcome”);
//注册变量$welcome,注意不需要加$
    $welcome=”Hello,PHP world!”;
    ……
    page_close();
    ?>

  第二页:

 代码如下

    <?php
    page_open();//开始session
    echo $welcome;//显示第一页中定义的$welcome
    page_close();//保存状态信息
    ?>

  注册完一个变量,当页面最后调用page_close()函数后,各个session变量会被写回到数据库中。如果忘记调用page_close()函数的话,变量就不会被写回数据库,这样将出现不可预知的后果。当变量被使用完毕,不再需要用到时,可以调用以下函数将变量删除:

 代码如下

    <?php
    page_open(array(“sess” => “Test _Session”));
    ……
    $sess->unregister( “variable_name”);
    ……
    page_close();
    ?> 

 

找到

session.gc_probability = 1

session.gc_divisor = 1000

上面这两项参数其实就是这个概率,默认情况下是1/1000

将 session.gc_divisor = 1000  改为 session.gc_divisor = 100 即可

如果想达到完全的实时,那么可以把这个参数改为1,这样概率就是100%了

看看session如何工作的

概述:每一次php请求,会有1/100的概率(默认值)触发“session回收”。如果“session回收”发生,那就会检查/tmp/sess_*的文件,如果最后的修改时间到现在超过了1440秒(gc_maxlifetime的值),就将其删除,意味着这些session过期失效。

1. session在server端(一般是Apache with PHP module)如何存在的?

默认的,php会将session保存在/tmp目录下,文件名为这个样子:sess_01aab840166fd1dc253e3b4a3f0b8381。每一个文件对应了一个session(会话)。
more /tmp/sess_01aab840166fd1dc253e3b4a3f0b8381
username|s:9:”jiangfeng”;admin|s:1:”0〃;
#变量名|类型:长度:值
删除这里的session文件,就表示对应的session失效了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注