第一种答案
那么, 最常见的一种回答是: 设置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 / —