看了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分钟就过期的优惠劵?

 最后放一段代码, 我木有测试的代码
 function SessExpire($expire = 0)
{
if($expire == 0){
$expire = ini_get("session.gc_maxlifetime");
} else {
ini_set("session.gc_maxlifetime", $expire);
} if(empty($_COOKIE[PHPSESSID]){
session_set_cookie_params($expire);
session_start();
} else {
session_start();
setcookie(PHPSESSID, session_id(), time() + $expire);
}
}

php中的session过期思考一二的更多相关文章

  1. C# asp.net IIS 在web.config和IIS中设置Session过期时间

    有时候在web.config设置sessionState 或者类文件里设置Session.Timeout,在IIS里访问时每次都是达不到时间就超时,原因是因为在IIS中设置了Session的超时时间, ...

  2. 关于web会话中的session过期时间的设置

    关于web会话中的session过期时间的设置 1.操作系统: 步骤:开始——〉管理工具——〉Internet信息服务(IIS)管理器——〉网站——〉默认网站——〉右键“属性”——〉主目录——〉配置— ...

  3. asp中设置session过期时间方法总结

    http://www.jb51.net/article/31217.htm asp中设置session过期时间方法总结 作者: 字体:[增加 减小] 类型:转载   asp中默认session过期时间 ...

  4. PHP中设置session过期的时间

    如何严格限制session在30分钟后过期!1.设置客户端cookie的lifetime为30分钟:2.设置session的最大存活周期也为30分钟:3.为每个session值加入时间戳,然后在程序调 ...

  5. Java中设置Session过期时间(Spring Boot)

    1.Spring Boot: server.session.cookie.comment = #注释会话cookie. server.session.cookie.domain = #会话cookie ...

  6. php程序中判断session过期

    我们最常用的是在php程序中设置,如下例程序所示: if(!isset($_SESSION['abc']) || time()-$_SESSION['abc']>60){ $_SESSION[' ...

  7. java中设置session过期时间

    Web容器 apache-tomcat-8.0.26\conf\web.xml中设置 <session-config> <!-- 时间单位为分钟 --> <session ...

  8. Jsp中解决session过期跳转到登陆页面并跳出iframe框架的方法

    1.可以用javaScript解决在你想控制跳转的页面,比如login.jsp中的<head>与</head>之间加入以下代码: <script language=”Ja ...

  9. session过期问题

    php中session过期时间设置及回收机制详解: 修改php中的session过期时间可以修改php配置文件php.ini中的session.gc_maxlifetime即可. 当php每发出一次请 ...

随机推荐

  1. Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)-C-Bracket Subsequence

    #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...

  2. Scrum Meeting NO.10

    Scrum Meeting No.10 1.会议内容 2.任务清单 徐越 序号 近期的任务 进行中 已完成 1 "我"回答过的问题 -- 界面 √ 2 "问题" ...

  3. 20135316王剑桥Linux内核学习记笔记第七周

    20135316王剑桥<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 一.可执行程序是怎么得来的? 编译 ...

  4. jdbcTemplete(转)

    文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供以下五类方法: execute方法:可以用于执行 ...

  5. Caffe2的安装

    源码下载 首先下载caffe2的源码:https://github.com/caffe2/caffe2 网上都建议使用git命令下载,因为caffe2依赖了很多第三方模块,git会根据依赖自动下载第三 ...

  6. Install alipay支付宝安全控件 on firefox in linux

    [root@rgqancy 下载]# ./aliedit.sh建议以非root账号安装支付宝安全控件请重启   firefox   使插件生效成功安装 支付宝安全控件请按任意键退出... what i ...

  7. Python装饰器的深入理解

    装饰器 #装饰器:本质上是函数,(装饰其他函数)就是为其他函数添加附加功能 #原则: 1.不能修改被装饰的函数的源代码 # 2.不能修改被装饰的函数的调用方式 #实现装饰器知识储备 #1.函数即变量 ...

  8. rsync实现数据同步

    希望两台机器指定目录的数据保持一致 192.168.19.252(master)                 192.168.19.251(slave) /cache 拉复制            ...

  9. mysql 8.0,运行springboot项目配置:

    1.修改pom.xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connecto ...

  10. centOS7 修改DNS

    #显示当前网络连接 #nmcli connection show NAME UUID TYPE DEVICE eno1 5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03 802 ...