zoukankan      html  css  js  c++  java
  • php的session与免登陆问题

    Session 与 Session的GC

    由于PHP的工作机制,它并没有一个daemon线程来定期的扫描Session 信息并判断其是否失效,当一个有效的请求发生时,PHP 会根据全局变量 session.gc_probability 和session.gc_divisor的值,来决定是否启用一个GC, 在默认情况下, session.gc_probability=1, session.gc_divisor =100 也就是说有1%的可能性启动GC(也就是说100个请求中只有一个gc会伴随100个中的某个请求而启动).

    GC 的工作就是扫描所有的Session信息,用当前时间减去session最后修改的时间,同session.gc_maxlifetime参数进行比较,如果生存时间超过gc_maxlifetime(默认24分钟) ,就将该session删除。你可以通过修改session.gc_maxlifetime参数来修改session的过期时间,修改完重启php-fpm与服务器,而且当访问量足够触发GC才能看到session过期时间。

    Session永不过期

    1.首先,保证存储在服务器的session永久存在:session.gc_maxlifetime设置为一个很大的值就不会被回收

    2.session.use_cookies设置为1,用cookie来传递sessionid

    3.session.cookie_lifetime,这个代表sessionid在客户端Cookie储存的时间,默认是0,代表浏览器一关闭sessionid就作废……就是因为这个所以PHP的 session不能永久使用! 那么我们把它设置为一个我们认为很大的数字吧。

    30天免密码登录实现

    思路:
    1、在用户登录成功时,创建session对象,保存用户信息
    2、将此session的sessionid保存到cookie中
    3、同时将sessionid于session对应关系存储到应用域中,以便后面可以根据sessionid来获取到session
    4、在用户关闭浏览器,重新打开浏览器访问网站时,读取用户的cookie,得到sessionid
    5、根据sessionid获取到第3步存储到应用域中的session对象
    6、从session中读取用户信息

    可以通过session在服务端的有效时间来控制,也可以通过sessionid在cookie中的有效时间来控制
    OVER

    负载均衡下session的存储

    问题:同一个对话如果被分配到多个机器节点下,那么session将不能被访问到

    解决方案:

    1.会话保存:通过负载均衡哈希算法(ip或者uid)将一个用户的所有请求落在一个固定节点,那么session就可以被访问到

    2.会话复制:将session文件用现有可行方案复制到集群所有节点下面,该方案不适合集群过大的情况

    3.会话共享:将session文件存储在第三方共享资源上,比如redis等地方,所有请求取session都从一个地方取

  • 相关阅读:
    将微信小程序上传到公司的账号下
    当HBuilderX运行时打不开微信开发者工具时
    vue路径中去掉#
    初次快速使用git
    小米商城应用效果(阴影效果)
    如何使用hover点击一个元素使另一个颜色变色
    Open browser failed!! Please check if you have installed the browser correct
    vue中解决跨域问题
    vue中如何实现点击动态切换样式
    es5中数组的迭代方法 forEach,map,filter,some,every
  • 原文地址:https://www.cnblogs.com/gauze/p/6670733.html
Copyright © 2011-2022 走看看