PHP会话控制:cookie和session区别与用法深入理解-php教程

资源魔 27 0

说到会话管制,年夜部人会想,那还没有简略吗?没有就是COOKIE以及SESSION吗?

确实就是cookie以及session,然而你真的会用吗?

几年后面试的时分我碰着了一个这样的成绩:

若何保障session正在1小时后生效?

过后我想这个还没有简略,将gc_maxlifetime设置为3600没有就好了。过后面试的人说,答复的不合错误,这样不克不及保障1小时后一定生效。当然他也没以及我说缘由。起初我归去后,细心查找了一番,才搞分明。

答复这个成绩前,先普及下cookie以及session的常识。

COOKIE与SESSION的区分与联络

存储地位的没有同:

  • cookie存储正在客户端

  • session寄存正在效劳端

他们之间的联络:

当效劳端开启session后,即

session_start();

后,会天生一个惟一ID(session_id),并经过呼应头通知客户端。客户端拿到后,会将它保留正在cookie中。当客户端再次发动申请时,会带上这个信息。效劳端收到这个信息后,就会去寄存session文件的目次去查找对应文件,找到后会去提取session信息。就是经过这样的机制,效劳端辨认了客户真个身份。

以是说,假如不cookie,session就不任何意思。

引见完cookie与session的关系后,咱们再来讲说session的无效期。

SESSION的渣滓收受接管

普通php默许的session无效期为24分钟。客户端正在超越这个工夫后不断不收回申请,就会有可能触发渣滓收受接管机制,删除了过时的session文件。为何说有可能?这就要说说渣滓机制的原理了。

php的session渣滓收受接管是有几率的,是由session.gc_probability以及session.gc_diviso确定几率的。几率为

session.gc_probability/session.gc_diviso

php默许gc_probability是1,而gc_diviso默许为100,也就是说每一次申请触发渣滓收受接管的几率为1/100。普通的,当咱们网站拜访量年夜的时分,能够将这个几率进步,比方1/1000,以缩小io操作。

另外另有一点要阐明:比方客户端A,此时新建了一个session(session的无效期为10分钟),过了8分钟后,A又发送了申请。这个时分他的session是2分钟后到期,仍是10分钟后到期?

谜底是10分钟后。由于第二次申请后,效劳真个session文件的修正工夫也扭转了。渣滓收受接管是看session文件最初的修正工夫。然而各人再想一想,对应的cookie无效期是否是也会更新?很惋惜,cookie无效期没有会更新。

若何保障1小时肯定过时

如今,咱们来看最后的成绩,若何保障session文件一个小时后肯定过时。session的渣滓收受接管是几率事情,一切不克不及指望他了。

那经过设置cookie的无效期了,经过设置cookie_lifetime能够做到么?

谜底仍是没有行。cookie是正在客户真个,他不了,只是正在下次申请的时分不克不及带上这个cookie了,但对应的session文件仍是存正在的。

其实这个成绩最简略的做法,是将session保留正在redis中,经过redis的键的过时工夫来保障1个小时分,肯定过时。该办法也是保举的办法

但只能用php的话,要怎么来实现呢?

能够为每个session都设置一个工夫戳,每一次拜访前都判别工夫戳。贴上代码:

<?php
session_start([
    'cookie_lifetime' => 3600,
    'gc_maxlifetime' => 3600
]);

if (isset($_SESSION['lifetime']) && $_SESSION['lifetime'] > time()) {
    // 未过时,更新session的lifetime及cookie的无效期
    $_SESSION['lifetime'] += 3600;
    $tmpVal = $_COOKIE[session_name()];
    setcookie(session_name(), $tmpVal, time() + 3600, '/');
} else {
    // 过时删除了
    $_SESSION = [];
    if (isset($_COOKIE[session_name()])) {
        setcookie(session_name(), '', time() - 100, '/');
    }
    session_destroy();
}

经过浏览了该内容,置信各人对php的会话应该有了更深的了解。

以上就是PHP会话管制:cookie以及session区分与用法深化了解的具体内容,更多请存眷资源魔其它相干文章!

标签: cookie php开发教程 php开发资料 php开发自学 session

抱歉,评论功能暂时关闭!