PHP 会话管理

@

1、为什么需要会话控制

HTTP是一个无状态的协议,当一个用户请求一个页面之后再请求一个页面,PHP将无法判断这两个页面是否来自同一个用户。

会话是可以对用户登录状态进行跟踪的一个机制,从而避免多次验证。

会话通过cookie和session实现对整个会话过程的跟踪。


2、Cookie和session

Session与cookie的功能相同。Session与Cookie的区别在于Session是记录在服务端的,而Cookie是记录在客户端的。

PHP的会话是通过唯一的会话id所驱动的。会话id是一个加密的随机数字,保证每个用户所分配到的id是唯一的。在整个会话的声明周期中都会保存在客户端,可以保存在用户机器的cookie中,也可以写在url中。

Session的两种实现方式

  1. 保存在cookie中
  2. 通过重写URL,将session id写入URL中。

3、PHP中的会话控制

  1. 环境配置

    ==启用 php.ini 中的session_auto_stray,但是无法使用对象作为会话变量,因为会话先于对象载入==。

  2. 开启会话:session_start();

    扫描二维码关注公众号,回复: 9349902 查看本文章
  3. 注册一个会话变量$_SESSION['键名']=5
    数组中的键可以自定义

    ==会话变量可以由用户通过get或post传入==

  4. 销毁会话变量

    • 销毁一个会话变量:unset($_SESSION['myvar']);
    • 一次性销毁全部会话变量: $_SESSION = array() $_SESSION = []
  5. 销毁会话

    session_destory()


4、session操作实质

session记录在服务端,对$_SESSION 的操作本质是服务器对session文件的操作。当客户端的访问请求中带有cookie时,服务器会从中取出session id并找到在硬盘上与id对应的session文件进行操作。

  1. session_start();

    • 为用户分配一个唯一的session id
    • 在服务端生成一个格式为sess_sessionId 的文件,其中存储会话过程中产生的数据。
      • 例:sess_oav9to18506jm6pokl1al5nus2
  2. $_SESSION['time']=2000

    在session文件中写入记录:time|s:4:"2000";

  3. unset($_SESSION['time']);

    在session文件中删除对应的记录

  4. $_SESSION = array() $_SESSION = []

    因为$_SESSION是一个数组,对数组置空的行为会删除所有的会话变量,即清空session 文件中所有的内容

  5. session_destory()

    结束会话的同时删除对应的session文件


5、更改session的保存路径

当一台服务器存在多个网站时会产生大量的session文件,如果都放在同一个目录下会影响访问速度。

此时修改session文件的保存目录可以优化性能

echo session_save_path(); :输出session文件的保存路径

echo session_save_path('路径'); :更改session文件的保存路径

==更改路径的操作需要在session_start()开启会话之前==(文件产生之后再更改保存路径就没有意义了)


6、session的两个函数

string session_name([string $name])

  1. 不指定参数时返回会话名称,指定参数时可以修改会话名称。
  2. ==在 session_start()之前使用==

string session_id([ string $id] )

  1. 不指定参数时返回会话id,指定参数时可以修改会话id,即修改相对于的session文件名称。
  2. ==在session_start()之前使用==

使用 session_name() 不指定参数时返回session 的名称,指定参数时可以修改会话名称

<?php
    
session_start();
session_name("hello");
echo session_name();  // 输出 hello
//但此时浏览器中存储的会话名称并没有改变

7、session的垃圾回收机制

当网站的运行时间较长且访问量较大时可能产生大量的session文件,如果没有对应的清理机制,硬盘迟早会被这些文件占满。

垃圾回收的一个原则是这个session文件应当有一段时间没有被使用,即设置一个生命周期,但是如果由PHP一直监控文件的创建时间会极大影响性能和访问速度。

所以触发垃圾回收机制应该是一个比较小概率的事件,触发概率事件时由PHP检查session文件的生命周期清理文件。

// php.ini 中的配置项
session.gc_probability
    session清除无效session的基率。

session.gc_diviso
    启动垃圾回收程序的概率。概率计算公式为:session.gc_probability/session.gc_divisor,如果网站访问量大建议将概率降低如 1/1000~5000。

session.gc_maxlifetime
    session文件过期时间,超过这个时间没有使用的session将视为垃圾,将在下次垃圾回收时删除。

8、cookie操作

服务端为客户端设置cookie之后客户端的请求信息中会自动带有cookie信息。

对应超全局数组$COOKIE

bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain= "" [, bool $secure = false [, bool $httponly = false ]]]]]] )

  • 读取cookie
    • var_dump($COOKIE);
  • 设置cookie的值
    • setcookie('web','hello');
  • 为cookie设置生命周期
    • setcookie('web','hello',time()+1000);
    • time() 是指返回自 Unix 纪元(January 1 1970 00:00:00 GMT)起的当前时间的秒数的函数
  • 删除一个cookie
    • setcookie('web','hello',1);
    • 过期即删除
  • 设置cookie的可访问路径
    • setcookie('web','hello',time()+1000,'\app');
    • 只允许app文件夹内的脚本文件使用这个cookie
  • 子域名共享cookie
    • setcookie('web','hello','time()+1000','\app','cookie.test');
    • 设置主域名为cookie.test的子域名都可以访问这个cookie
  • 设置这个 Cookie 仅通过安全的 HTTPS 连接传给客户端
    • setcookie('web','hello','time()+1000','\app','cookie.test','true')
    • 如果是false即允许通过http和https两种方式传输cookie
  • 禁止JavaScript等脚本语言使用cookie
    • setcookie('web','hello','time()+1000','\app','cookie.test','true','true');

待补充:自定义session驱动

猜你喜欢

转载自www.cnblogs.com/lanying0/p/12348722.html