• 全面解读php-php会话控制技术


    一、PHP会话控制技术

    1、为什么要使用会话控制技术?

    因为http协议是无状态协议,所以同一个用户在请求同一个页面两次的时候,http协议不会认为这两次请求都来自于同一个用户,会把它们当做是两次请求的独立,如果用户已经执行了登录操作,再次请求页面,http协议不会认为该用户已经做过登录,那么会话控制技术就是为了解决这个问题。

    2、实现方式

    • 通过GET传参。
    • 通过cookie存储。
    • 通过session存储。

    3、cookie

    cookie是服务端发送给客户端的片段信息,存储在客户端浏览器的内存或者硬盘中的技术,可以把它当做浏览器中的一个小文件,这个小文件存存了客户端的一些信息

    //设置cookie
    setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] ) : bool
    //删除cookie
    setcookie($name,'', time()-1);

    cookie的优缺点:

    • 优点:存储在客户端,不会占用服务器资源。
    • 缺点:不够安全,敏感信息不宜存入cookie,且用户可以设置禁用cookie
    • 如果 cookie被禁用了,可以通过url传递SessionID,服务器会通过这个SessionID来找到对应的session

    4、SESSION

    session_start() ; //开启session
    $_SESSION[$key] = $val //设置session
    session_destory() //销毁session

    session的相关配置

    //是否要自动开启session
    session.auto_start
    
    //存储SessionID的cookie的有效域
    session.cookie_domain
    
    //客户端的cookie存储SessionID的有效时间,默认值0表示直到浏览器关闭
    session.cookie_lifetime
    
    //客户端的cookie存储SessionID的路径
    session.cookie_path
    
    //cookie中SessionID的名称,默认值是PHPSESSID
    session.name
    
    //session文件在服务中的存储路径
    session.save_path
    
    //是否使用cookie来传递SessionID
    session.use_cookies
    
    //是否使用传递的方式(即url)来传递SessionID
    session.use_trans_sid
    
    垃圾回收机制相关
    //gc_probability/gc_divisor定义会话启动时垃圾回收启动的概率,gc_probability默认值为1,gc_divisor默认值为100,1/100意味着每个请求中有1/100的概率启动gc进程
    session.gc_probability
    
    // 默认值为 100
    session.gc_divisor
    
    //指定过了多少秒后,session数据就会被定义为垃圾进行回收。
    session.gc_maxlifetime
    
    //session的存储句柄,默认是files,可以把它定义为把session存储到redis,mysql之类的地方。
    session.save_handler

     session的优缺点

    • 优点:安全
    • 缺点:
    • 会占用服务器的资源
    • 分布式的时候,还是要借助redis之类来保持用户登录状态,否则多台服务器之间没办法共用session。

    如何传递SessionID

    <a href = "test.php?<?php echo session_name()  . '=' . session_id() "?><a href = "test.php?<?php echo SID "?>

    SESSION的存储(分布式)

    假设我现在有5台服务器,用户通过第一台登录后,并将session保存到了第一台服务器,这是跳转到下一个页面的时候,假如轮询到第四台服务器,这时在第四台服务器上就找不到这个SessionID所对应的文件了,因为session文件是在第一台服务器里面存储着的。

    解决方法:

    不要在用文件的方式来存储,改用内存服务器,如 redis 来进行存储,甚至使用 msql数据库直接存储也可以。

    // 设置用户自定义会话存储函数
    session_set_save_handler()

     本文为袋鼠学习中的总结,如有转载请注明出处:https://www.cnblogs.com/chrdai/p/11154583.html

  • 相关阅读:
    4. Android框架和工具之 android-async-http
    3. Android框架和工具之 xUtils(BitmapUtils)
    自定义多列排序:C++/Java实现
    Java套接字
    Java泛型
    线程同步之生产者消费者
    面向对象之深复制与浅复制
    谈谈多线程
    递归与尾递归
    单例模式:Instance
  • 原文地址:https://www.cnblogs.com/chrdai/p/11154583.html
Copyright © 2020-2023  润新知