看了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. ES5和ES6对象导出和导入(转载,待整理)

    1.import ... form...替代 require() //不接收对象 require:require('s.css'); //(es5) improt 's.css' //(es6) // ...

  2. Chrome F12调试

    F12 断点 F5 Esc 选择鼠标右击:编辑||hover样式 Sonrces go to file (ctrl+p) 搜搜文件名

  3. Scrum Meeting 5

                第五次会议 No_00:工作情况 No_01:任务说明 待完成 已完成 No_10:燃尽图 No_11:照片记录 待更新 No_100:代码/文档签入记录 No_101:出席表 ...

  4. 20135327郭皓--Linux内核分析第九周 期中总结

    Linux内核分析第九周 期中总结 一.知识概要 1. 计算机是如何工作的 存储程序计算机工作模型:冯诺依曼体系结构 X86汇编基础 会变一个简单的C程序分析其汇编指令执行过程 2. 操作系统是如何工 ...

  5. Android之JSON格式数据解析

    查看原文:http://blog.csdn.net/hantangsongming/article/details/42234293 JSON:JavaScript 对象表示法(JavaScript ...

  6. 实现基于SSH的门票管理系统开发的质量属性

    我要做的是一个基于SSH的门票售卖系统,在系统中常见的质量属性有:可用性.可修改性.性能.安全性.易用性. 可用性方面: 可用性是指系统正常运行时间的比例,是通过两次故障之间的时间长度或在系统崩溃情况 ...

  7. HDOJ2025_查找最大元素

    一道简单题 HDOJ2025_查找最大元素 #include<stdio.h> #include<stdlib.h> #include<ctype.h> #incl ...

  8. vue路由异步组件案例

    最近研究了vue性能优化,涉及到vue异步组件.一番研究得出如下的解决方案. 原理:利用webpack对代码进行分割是异步调用组件前提.异步组件在优先级上让位同步组件.下面介绍的是怎么实现异步组件. ...

  9. Jenkins and Python

    https://jenkins.io/solutions/python/ In the Python ecosystem there are tools which can be integrated ...

  10. JMeter性能测试基础 (4)-使用JMeter录制测试脚本

    在进行压力测试时,由于很多web页面包含了Ajax异步请求等内容,为模拟用户真实输入,除了对html的访问外,还需要将其它的访问考虑入内,这时最好的办法就是对实际访问过程中的所有请求进行录制. 例如, ...