第十一章:第15节 PHP与MySQL——PHP实现会员管理(九)了解SESSION的相关设置

更新于:2017-10-19 19:32:33

如果只是用来做个小网站,就没有必要兴师动众改变session的配置。但是在做大项目使用默认的session机制可能满足不了我们的需求,这就需要我们进一步细腻化地了解session的相关知识。


1.png


在PHP配置文件里有关session的参数设置很多,对几个重要的了解下:


1、session.use_cookies:默认的值是“1”,代表SessionID使用Cookie来传递,反之就是使用Query_String来传递(get方式传递); 


使用get方式传递sessionID数据,安全大大降低。


2、session.name:这个就是SessionID储存的Cookie名字,也可能是Query_String来传递,默认值是“PHPSESSID”;


很多网站为了不被轻易识别出储存sessionID的cookie名字,都会把它改掉。有以下三种方式可做更改:


1)直接在PHP配置文件里更改,这种方式不太推荐,因为它影响到所有的网站。2)在程序里使用函数session_name()。3)使用函数ini_set('session.name','新名字'),ini_set函数可用来修改各种PHP配置参数。


另外:session_id()函数可获取当前的sessionID号和设置当前的sessionID号。


3、session.auto_start:是否开启session,默认是不开启的。我们都知道了,用session_start或ini_set可开启session。


提示:一旦开启了session,就不能修改session的任何参数配置了。也就是说修改session有关的配置需在开启session之前。


4、session.cookie_lifetime:这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个Session不能永久使用! 


通过前几节内容知道,session是靠cookie实现的,只用cookie PHP也可以实现会话,有了session使得PHP的会话机制得到升级。cookie要比session更显得重要。


session的储存是有时间的,cookie也是有时间的,cookie如果到期了,session的时间再长也不起作用。所以这个参数对整个session功能作用挺大。


还有session.cookie_path、session.cookie_domain、session.cookie_httponly、session.cookie_secure这四个参数,想想setcokkie这个函数的参数应该能明白它们的作用。


5、session.gc_maxlifetime:这个是Session数据在服务器端储存的时间(可理解为session的有效时间),默认是1440(24分钟),如果超过这个时间,那么Session数据就有可能被删除! 


为什么说会有可能被删除?


PHP的session有一套垃圾回收机制GC(Garbage Collector)。一个session文件超过了gc_maxlifetime没有被修改,就会被视为垃圾,GC被启动后会删除所有垃圾。由于PHP的工作机制,它并没有一个单独线程来定时地扫描session信息并判断其是否失效。考虑到性能的因素,这套垃圾回收机制也不是每次请求访问都启动,PHP会根据一个比率值来决定是否启动一个GC。 


6、session.gc_probability、session.gc_divisor:决定GC启动的两个参数,session.gc_probability是分子,session.gc_divisor是分母。


默认情况下,session.gc_probability = 1,session.gc_divisor =1000,也就是说有0.1%的可能性会启动GC。


提示说明:如果sessionID的cookie没有失效,就算session过期了但没有被删除,依然是可以继续使用的。


重点:


关于PHPsession的垃圾回收机制感兴趣的网上可搜索学习资料来看,楠神建议:不要过多去研究它。


PHP默认的session存储机制是以文件形式实现的,对于这种短时间访问频繁又不需长久储存的数据是不是存在内存中更合适,就像缓存一样。实现把session数据存到内存中,这就需要重写一套session存储机制。


而且PHP自身的session存储机制并不好用,楠神曾经在Linux下的一个项目,不知为什么不管怎么设置gc_maxlifetime(甚至直接修改的PHP配置文件里的参数),只要超过24分钟(在没有往session写操作的情况下)session就被清空了,在windows下就不出现这样的情况。虽然网上有说是因为同服务器的多个站点session相互影响的原因,也不是这个原因,到现在楠神也没研究明白。自己写一套session存储机制(存到内存里的,后面学习),非常好用,所以也就没有必要再去研究那个问题了。


7、session.save_path:session文件在服务器存储的物理路径。


8、session.cache_limiter、session.cache_expire:这两个缓存参数指的是客户端的一些缓存,不是服务器端的。楠神暂无研究,不是特重要。


9、session.save_handler:值为file时,PHP使用默认的session存储机制;值为user时,使用用户自定义session存储机制。