• php中的session过期思考一二


    看了php开发组成员鸟哥的一篇关于php设置session过期(http://www.laruence.com/2012/01/10/2469.html)的文章
    他也说了一般人的回答的几个答案, 回答别人的问题也是自己思考的一个过程,和自己写blog,用码字来促使自己思考一样,
    所以我写下这篇读书笔记- -!
     
    他的问题
    “我在面试的时候, 经常会问一个问题: “如何设置一个30分钟过期的Session?”, 大家不要觉得看似简单, 这里面包含的知识挺多,
    特别适合考察基本功是否扎实, 谁来回答试试” 
    一:首先
    让我们回想一下session的诞生,这个要跟http的特性说起来,因为http是一个无状态的协议,访问一次之后,链接就断开了,
    为了client跟server能建立一种联系,就这样cookie应运而生了, 那他是怎么从客户端传递到服务器端的呢,当然是通过http协议
    来传输的, session就是通过cookie传输的到服务器端的
    有图有真相
     
     
    二:session在php.ini中的设置
    第一种方案 (错误答案)
    有一个过期时间 session.gc_maxlifetime , 这个可以设置session的过期时间,假如我们设置30分钟过期,但是看鸟哥的blog,说这是一个小概率事件,它是由2个参数决定的
    session.gc_probilitysession.gc_divisor(参见:http://www.laruence.com/2011/03/29/1949.html), 这个默认的值分别是1和100, 也就是有1%的机会, PHP会在一个Session启动时,
    运行Session gc. 不能保证到30分钟的时候一定会过期.
     
    然后鸟哥讲了 session在 类 *unix服务器上, php是怎么判断session过期时间的:
    在服务器上,每一个session是独立存放在一个文件中的,php.ini中有设置 session.save_path,类*unix一般是放在/tmp目下的,而计算session过期时间是通过
    stat session的文件修改日期,他说了如果修改为大概率世间出现的问题:
    :性能问题 
    :如果session文件写入 a = 10, 5分钟后过期, 然后过了3分钟又写入b = 12,
    那么这个文件的修改日期就变了,那么就是session过期的时间也变了, 那么a就不能在5分钟后清除
    :还有第三个原因,我复制过来

    3. PHP默认的(Linux为例), 是使用/tmp 作为Session的默认存储目录, 并且手册中也有如下的描述:

    Note: 如果不同的脚本具有不同的 session.gc_maxlifetime 数值但是共享了同一个地方存储会话数据,则具有最小数值的脚本会清理数据。此情况下,与 session.save_path 一起使用本指令。

    也就是说, 如果有俩个应用都没有指定自己独立的save_path, 一个设置了过期时间为2分钟(假设为A), 一个设置为30分钟(假设为B), 那么每次当A的Session gc运行的时候, 就会同时删除属于应用B的Session files.

     

    第二种 (错误答案)

    设置 cookie的过期时间

    session.cookie_lifetime. 这个参数来设置cookie的过期时间, 这个更不靠谱, cookie是客户端的, session是服务端的

     

    第三种:(对的)

    用memcached redis这种k-v数据库来存储session

     
    第四种: (最好的答案)
    复制他的内容, 我有点懒 

    当然, 面试不是为了难道你, 而是为了考察思考的周密性. 在这个过程中我会提示出这些陷阱, 所以一般来说, 符合题意的做法是:

    1. 设置Cookie过期时间30分钟, 并设置Session的lifetime也为30分钟.

    2. 自己为每一个Session值增加Time stamp.

    3. 每次访问之前, 判断时间戳.

    最后, 有同学问, 为什么要设置30分钟的过期时间: 这个, 首先这是为了面试, 第二, 实际使用场景的话, 比如30分钟就过期的优惠劵?

     最后放一段代码, 我木有测试的代码
     1 function SessExpire($expire = 0)
     2 {
     3     if($expire == 0){
     4         $expire = ini_get("session.gc_maxlifetime");
     5     } else {
     6         ini_set("session.gc_maxlifetime", $expire);
     7     }
     8     
     9     if(empty($_COOKIE[PHPSESSID]){
    10         session_set_cookie_params($expire);
    11         session_start();
    12     } else {
    13         session_start();
    14         setcookie(PHPSESSID, session_id(), time() + $expire);
    15     }
    16 }

     

  • 相关阅读:
    算法学习-顺序查找
    EF框架中Attach与Entry
    EntityFramework更新实体绑定实体字段简便方法
    C# 快速写入本地文件
    Vue 3.0初探
    二维管线生成三维管线,转换3DTiles 思路
    Civil3d中 如何用管轴线的变坡点桩号控制其他纵断面数据的显示?
    jupyter
    jenkins
    ambari
  • 原文地址:https://www.cnblogs.com/jiujuan/p/php.html
Copyright © 2020-2023  润新知