【PHP】对TP中session的理解

目前只看了以文件方式存储的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         // 是否自动开启 SESSION
10         '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         }
expire设置

  可以看出是通过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.这些情况的解决办法

 

如有不对,欢迎指正,本人小白...理解很有可能有偏差

参考:

http://www.cnblogs.com/gossip/p/5596092.html

http://www.nowamagic.net/librarys/veda/detail/358

原文地址:https://www.cnblogs.com/Hed-geh0g/p/7323827.html