设置session有效时间的方法(服务器session有效期)

设置session有效时间的方法(服务器session有效期)

第一种答案

那么, 最常见的一种回答是: 设置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. 每次访问之前, 判断时间戳.

温馨给出session和cookie的相关参数及说明:

cookie:

①语法:setcookie(名字,[值],[过期时间],[有效目录],[子域名])

②设置cookie , setcookie(name,[值],[过期时间])

③临时性cookie 如:setcookie(‘name’,’张三’) 关闭浏览器cookie消失

④永久性cookie 如:setcookie(‘name’,’张三’,time() 3600) 一个小时后消失(包括关闭浏览器),不同浏览器cookie不相通

⑤销毁cookie , 1.setcookie(name,false)2.setcookei(name,””)

⑥默认情况下,cookie只能在当前目录及后代目录中生效

setcookie(‘name’,’张三’,0,’/’); 表示cookie在整个站点都有效

setcookie(‘name’,’张三’,0,”,’baidu.com’); 默认情况下,cookie是区分子域名的,可以设置支持所有的子域名,此案例为支持baidu.com

⑦cookie,可以保存的数据类型,字符串,数值型,下标(如:array[‘a’])不能保存布尔型,数组型

⑧cookie保存在客户端,当第二次请求时,会携带第一次从服务器端的响应头中传递进来的信息(如:name=’tom’)

⑨缺点是 a,cookie保存在客户端安全性低

b,只能保存字符串和数字,可控性低

c,数据存放在头信息中,会增加请求的数据负载

d,大多数浏览器对cookie的限制是4K

直接输出$_COOKIE,可以获得该页面所有的cookie保存的信息,返回的是一个数组,可以用serialize()序列化成一个字符串

session:

①基本语法:session_start();开启会话,访问时服务器生成会话文件 session_destory();销毁会话文件

②基于cookie技术,保存在服务器端,在cookie中保存会话的编号,通过会话编号获取会话的值

③每个用户只能访问自己的会话,不能访问别人的会话,重复开启会话会报错,可以加@符号屏蔽掉

④session_start()函数,PHP从session仓库中加载已经存储的session变量

⑤在执行PHP的时候会将session的值保存到session文件中,脚本执行完毕,

⑥可保存的数据类型:除了资源型以外都可以保存

⑦一个会话文件对应一个会话编号,但是同一个ip访问同一个服务器时,只会产生同一个会话名称,当浏览器关闭后,当再次打开的时候服务器会重新给一个编号来对应sessiono文件,

a、session_decode() 对 $data 参数中的已经序列化的会话数据进行解码, 并且使用解码后的数据填充 $_SESSION 超级全局变量。

b、session_id 会话编号

会话编号的命名规则在php.ini中:具体如下

如:session.hash_bits_per_character = 5:组成会话名字的一个字符由5位组成。

计算方法:5个位就是2的5次方,可以支持32个字符,0~9是10个字符,a-v是22个字符,所以范围是(0~9 a~v)

c、session_name会话名称

d、session_commit

e、session_destroy

f、session_encode

⑧session入库 :默认是存储在文件夹中的,可以通过以下函数将session文件保存到服务器中

session_set_save_handler(open,close,read,write,destroy,gc) 设置用户自定义会话存储函数。 如果想使用 PHP 内置的会话存储机制之外的方式, 可以使用本函数。 例如,可以自定义会话存储函数来将会话数据存储到数据库.

注意:上面函数中的六个元素,就是六个函数,open(),read(),close(),write(),destroy(),gc(),这些函数在上式的内部自动调用,上式函数一般放在session_start();的后面

表示当会话开启后,自动执行会话储存函数

⑨关于会话的配置:

a、session.auto_start = 0:自动开启会话

b、session.name = PHPSESSID:设置会话的名称

c、session.cookie_lifetime = 0:会话编号保存在cookie中的有效期

d、session.cookie_path = /:保存会话编号的cookie整站有效

e、session.cookie_domain =:保存会话编号的cookie在当前域名下有效

f、session.save_handler = files:会话以文件的形式保存

g、session.hash_function = 0

h、session.save_path = “D:/amp/tmp” 设置session文件的存储位置

i、session.gc_maxlifetime = 1440:会话在服务器的生命周期,即会话的过期时间默认 1440秒=24分钟

j、session.save_path = “N;path”中N表示用N级文件夹来保存会话,用会话名字的第一个字母做一级目录,第二个字母做二级目录。以此类推

1、cookie和session的区别

2、语法:setcookie(名字,值,过期时间,有效目录,子域名)

3、删除cookie

a)setcookie(‘name’):清空cookie的值

b)setcookie(‘name’,false):删除cookie

c)setcookie(‘name’,’’);删除cookie

4、cookie不能存放数组类型,但是支持下标,当数据请求到服务器的时候,相同的名字会自动的转成数组。

5、默认情况下,cookie在当前目录和子目录下有效,“/”表示在根目录下有效

6、默认情况下,cookie是区分子域名的,可以将cookie设置为在同属一级域名的网站下有效

7、Session是基于cookie的技术

8、默认情况下,会话不会自动开启,必须显式的开启会话session_start()

9、也可以在php.ini中设置session.auto_start=1自动开启会话

10、Session_id():获取会话编号

11、Session_name():获取会话名称

12、重复开启会话会报错

13、关于会话的配置

a)session.save_path:会话保存的路径

b)session.gc_maxlifetime=1440;会话在服务器的生命周期

c)session.name=PHPSESSID:会话编号的名字

d)session.hash_function:设置会话名字的hash算法

e)session.hash_bits_per_character:保存每个字符的位数。

f)session.cookie_lifetime:会话编号在cookie中保存的时间

g)session.cookie_path=/:保存会话编号的cookie整站有效

h)session.cookie_domain:保存会话编号的cookie当前域名下有效

i)session.save_handler=files:会话的存储方式,可以更改的

j)session.gc_probability=1:删除垃圾的概率

k)session.gc_divisior=1000;删除垃圾的分母

14、默认情况下,session是基于cookie的,可以更改配置使得session不基于cookie.

a)Session.use_only_cookie=0:session不仅仅依赖cookie

b)Session.use_trans_sid=1:允许使用其他形式传递session的编号

15、可以更改会话的存储

a)session _set _save_handler()更改会话的存储,必须写在session_start()之前

16、session_destroy():销毁会话,调用此函数可以删除会话在存储介质上的文件。

— / END / —

发表评论

登录后才能评论