目前只看了以文件方式存储的seesion机制,缓存和数据库的搞懂之后再补上
1.session的生命周期设置
config.php中session配置里可以设定session的生命周期
1 'session' => [ 2 'id' => '', 3 // SESSION_ID的提交变量,解决flash上传跨域 4 'var_session_id' => '', 5 // SESSION 前缀 6 'prefix' => 'think', 7 // 驱动方式 支持redis memcache memcached 8 'type' => 'redis ', 9 // 是否自动开启 SESSION10 'auto_start' => true,11 12 'expire' => 20, // Sessions生命周期13 14 'table_name' => 'session', // 表名(不包含前缀)15 16 'db_config' => '', //应用配置文件中配置的额外的数据库连接信息17 ],
在/think/Seesion.php有:
1 if (isset($config['expire'])) {2 ini_set('session.gc_maxlifetime', $config['expire']);3 ini_set('session.cookie_lifetime', $config['expire']);4 }
可以看出是通过ini_set()修改了php.ini中的session.gc_maxlifetime(服务器上session有效期)和session.cookie_lifetime(客户端seesion有效期)来达到改变session生命周期
2.session的销毁
session的销毁有两种情况:(1) 过期, (2) 浏览器关闭(但是也有很多情况下浏览器关闭了session未被销毁,这些情况是需要避免的)(关闭浏览器至过期归于情况(1))
那php是如何销毁session的呢?
情况(1):每发送一次php请求,就有1/100的几率触发`session回收`机制,它会去tmp/tmp下检查所有的session最后修改时间,如果过期则删除该文件。
情况(2):客户端会用cookie记录sessionId,服务器需要利用这个seesionId来匹配seesion数据。若不设置cookie的过期时间,默认情况下关闭浏览器cookie失效,这时候对应的session失效;若通过max-age设置了cookie的过期时间,则到达这个过期时间之后cookie才会被销毁。
3.为什么要先执行session_start()
新建session之前执行session_start()是告诉服务器要种一个cookie以及准备好session文件;
读取session之前执行session_start()是告诉服务器,赶紧根据session id把session文件反序列化。
只有一个session函数可以在session_start()之前执行,session_name():读取或指定session名称(比如默认的就是”PHPSESSID”),这个当然要在session_start之前执行。
思考:
1.当关闭浏览器时,session未被销毁的原因可能有哪些?
2.这些情况的解决办法
如有不对,欢迎指正,本人小白...理解很有可能有偏差
参考: