php session生存周期

今天在我的微博(Laruence)上发出一个问题:

我在面试的时候, 经常会问一个问题: “如何设置一个30分钟过期的Session?”, 大家不要觉得看似简单, 这里面包含的知识挺多, 特别适合考察基本功是否扎实, 谁来回答试试? 呵呵

为什么问这个问题呢? 1. 我在Twitter上看到了有人讨论这个问题, 2 想起来我经常问这个问题, 所以~~

在这里, 我来解答下这个题目.

第一种回答

那么, 最常见的一种回答是: 设置Session的过期时间, 也就是session.gc_maxlifetime, 这种回答是不正确的, 原因如下:

1. 首先, 这个PHP是用一定的概率来运行session的gc的, 也就是session.gc_probability和session.gc_divisor(介绍参看深入理解PHP原理之Session Gc的一个小概率Notice), 这个默认的值分别是1和100, 也就是有1%的机会, PHP会在一个Session启动时, 运行Session gc. 不能保证到30分钟的时候一定会过期.

2. 那设置一个大概率的清理机会呢? 还是不妥, 为什么? 因为PHP使用stat Session文件的修改时间来判断是否过期, 如果增大这个概率一来会降低性能, 二来, PHP使用”一个”文件来保存和一个会话相关的Session变量, 假设我5分钟前设置了一个a=1的Session变量, 5分钟后又设置了一个b=2的Seesion变量, 那么这个Session文件的修改时间为添加b时刻的时间, 那么a就不能在30分钟的时候, 被清理了. 另外还有下面第三个原因.

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

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

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

所以, 第一种答案是不”完全严格”正确的.

第二种答案

还有一种常见的答案是: 设置Session ID的载体, Cookie的过期时间, 也就是session.cookie_lifetime. 这种回答也是不正确的, 原因如下:

这个过期只是Cookie过期, 换个说法这点就考察Cookie和Session的区别, Session过期是服务器过期, 而Cookie过期是客户端(浏览器)来保证的, 即使你设置了Cookie过期, 这个只能保证标准浏览器到期的时候, 不会发送这个Cookie(包含着Session ID), 而如果通过构造请求, 还是可以使用这个Session ID的值.

第三种答案

使用memcache, redis等, okey, 这种答案是一种正确答案. 不过, 很显然出题者肯定还会接着问你, 如果只是使用PHP呢?

第四种答案

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

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

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

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

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

thanks 

以上转载自鸟哥的文章http://www.laruence.com/2012/01/10/2469.html。说的很清楚。

另外:

1、如果使用file_handler作为Session的save handler并且是多级目录的情况下,GC将不会去清除session文件。

2、php 必须有权限去删除这些文件。

时间: 2024-11-09 00:18:55

php session生存周期的相关文章

php 自定义session

session句柄定义:class SessionHandler{ private $_driver; //驱动 private $_gcMaxLifeTime=1440; //session生存周期 private $_gcProbability=5; //回收因子,不用每次执行session都执行垃圾回收机制,注意:回收因子越大,命中回收机率越大 public function __construct(){ //ini_set('session.gc_divisor',1); $this->

[Java][Spring][scurity]同步session控制,防止一个用户多次登录

[Spring][scurity]同步session控制.防止一个用户多次登录 假设你希望限制单个用户仅仅能登录到你的程序一次,Spring Security通过加入以下简单的部分支持这个功能. 1.你须要把以下的监听器加入到你的web.xml文件中,让Spring Security获得session生存周期事件: <listener> <listener-class> org.springframework.security.ui.session.HttpSessionEvent

session &amp; cookie(li)

Session & Cookie 一.定义 Session,用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间.Cookie,由服务器端生成,发送给浏览器,浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie). Session指的是会话,在一次交互的过程中,可以记录住用户的过程,内容保存在服务器端.session判断是否是同一个,需要客户端返回特定

Session提要

Session即会话,批一种持续性的.双向的链接.Sesstion和Cookie本质上没有什么区别,都是针对HTTP协议的局限性而提出的一种保持客户端和服务器间保持会话连接状态的机制. Session的实现可以有多种,如URL重写.Cookie,通过在Cookie中存储sessionID实现Session传递. 针对Web网站来说,Session批用户在浏览器某个网站时,从进入网站到浏览器关闭这段时间内会话.由此可知,session实际上是一个特定的时间概念.使用session可以在网站的上下文

JSP 语法/标签

┣1.declaration Declaration定义了JSP脚本语言使用的变量和函数,这类似于Java中定义全局变量,或可以把它想像成pascal编程语言中的单元文件的interface部分.声明的X M L形式语法为:<jsp:declaration> declaration goes here < /jsp:declaration>举例如下:<%! public String f(int i) { if (i<3) return("...")

jsp_03_jsp语法

JSP语法 首先看一个由Dreamweaver8创建的默认JSP文档的代码. 1 <%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %> 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/

故障排除 Mybatis ORA-01000 和 本地缓存问题

※异常信息 环境 MyBatis Oracle11.2c Terasoluna BatchCaused by: org.springframework.jdbc.UncategorizedSQLException: ### Error updating database. Cause: java.sql.SQLException: ORA-00604: 再帰SQLレベル1でエラーが発生しました.ORA-01000: 最大オープン?カーソル数を超えました.ORA-00604: 再帰SQLレベル1で

PHP下的session的生存周期

首先说一下session的创建的开始到结束的过程. 当程序需要为某个客户端的请求创建一个 session 的时候,服务器首先会检查这个客户端是否已经包含了一个 session 标识,这个我们称为 session id(获取方法为 session_id() ),如果已包含一个 session id 则说明此客户端之前已经创建过 session,服务器则按照 session id 把这个 session 中的值检索出来,如果客户端不包含 session id,说明此客户端第一次请求服务器或手动清除过

PHP session如何实现跨子域?

跨域问题在cooike及session中我们经常会使用到了,不过php对于子域处理是比较简单的了,我们有许多的一些办法,下面来整理一下,希望对大家的php学习有帮助吧. Session主要分两部分: 一个是Session数据,该数据默认情况下是存放在服务器的tmp文件下的,是以文件形式存在. 另一个是标志着Session数据的Session Id,Session ID,就是那个 Session 文件的文件名,Session ID 是随机生成的,因此能保证唯一性和随机性,确保 Session 的安