• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > PHP会话控制:cookie和session区别与用法深入理解

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

作者:站长图库 字体:[增加 减小] 来源:互联网 时间:2022-04-29

站长图库向大家介绍了PHP会话控制,cookie和session区别与用法,深入理解等相关知识,希望对您有所帮助

说到会话控制,大部人会想,那还不简单吗?不就是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都设置一个时间戳,每次访问前都判断时间戳。贴上代码:

<?phpsession_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的会话应该有了更深的理解。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • PHP中对于会话控制里的session如何使用?
  • PHP会话控制:cookie和session区别与用法深入理解

相关文章

  • 2022-04-29Thinkphp volist多重循环原样输出数组key值
  • 2022-04-29Photoshop简单制作蓝色洁净星星文字效果
  • 2022-04-29DEDE建站内部SEO优化
  • 2022-04-297B2主题美化之右上角投稿美化+加上搜索
  • 2022-04-29Phpcms V9管理后台登陆及会员注册登录模板的修改
  • 2022-04-29Photoshop制作精致的橙色石纹立体字
  • 2022-04-29DEDECMS修改提示信息方法
  • 2022-04-29详解PHP中的addcslashes()函数
  • 2022-04-29浅谈bootstrap table分页的实现两种方式
  • 2022-04-29Thinkphp极验滑动验证码实现步骤解析

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • 详解MySQL 联合查询 (IN和EXISTS区别)
    • PHP微信小程序解包过程实例详解
    • 浅析小程序中怎么让scroll-view按照指定位置滚动
    • Vue中Computed和Watch的用法及区别
    • SQLSTATE[HY000]: General error: mode must be an integer
    • 详解PHP中__construct()构造方法
    • Photoshop制作漂亮的暗红色网页框架
    • DEDECMS列表页缩略图添加alt信息的方法
    • 社交网站内容对SEO的价值
    • 10个超级有用的PHP代码片段(建议收藏)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有