看了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. CF 1047 C. Enlarge GCD

    传送门 [http://codeforces.com/contest/1047/problem/C] 题意 给你n个数,移除最少的数字使剩下的数字GCD大于初始GCD 思路 需要一点暴力的技巧,先求出 ...

  2. keras-VGG16 猫狗分类器

    keras 原理: keras系列︱图像多分类训练与利用bottleneck features进行微调(三)https://blog.csdn.net/sinat_26917383/article/d ...

  3. 软件工程——移动的HelloWorld

    package disiti;       import java.awt.Color;   import java.awt.Cursor;   import java.awt.Font;   imp ...

  4. react 动态获取数据

    如果reander()里面的dom元素是动态获取的,就要将函数放到setSTATE()里面执行

  5. Tomcat7解决java.lang.OutOfMemoryError: PermGen space

    上述两参数,可根据实际情况,逐渐调大.

  6. Activiti启动某个流程失败,页面报500

    现象:Activiti启动某个流程失败,页面报500,错误日志如下. 2017-06-19 10:50:09 [org.activiti.engine.impl.interceptor.Command ...

  7. SpringMvc 文件上传注意事项

    前端 1.表单提交方法与格式 <form class="form-horizontal" action="/biz/patent/edit" method ...

  8. Java并发—synchronized关键字

    synchronized关键字的作用是线程同步,而线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. synchronized用法 1. 在需要同步的方法的方法签名中加入synchro ...

  9. 通过几个例子看sed的模式空间与保持空间

    SED之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“暂存缓冲区(holdingspace)这2个空间的使 ...

  10. scipy积分 integral

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/5/24 15:03 # @Author : zhang chao # @Fi ...