zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    剑指offer——斐波那契数列
    剑指offer——用两个栈实现队列
    剑指offer——二维数组中的查找
    LeetCode第九题—— Palindrome Number(判断回文数)
    java 面试题汇总
    idea设置方法注释
    解决java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
    Timer和TimerTask详解
    java8函数式接口(Functional Interface)
    Python执行选择性粘贴
  • 原文地址:https://www.cnblogs.com/Hed-geh0g/p/7323827.html
Copyright © 2011-2022 走看看