PHP 会话管理
Posted lanying0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP 会话管理相关的知识,希望对你有一定的参考价值。
目录
@
1、为什么需要会话控制
HTTP是一个无状态的协议,当一个用户请求一个页面之后再请求一个页面,php将无法判断这两个页面是否来自同一个用户。
会话是可以对用户登录状态进行跟踪的一个机制,从而避免多次验证。
会话通过cookie和session实现对整个会话过程的跟踪。
2、Cookie和session
Session与cookie的功能相同。Session与Cookie的区别在于Session是记录在服务端的,而Cookie是记录在客户端的。
PHP的会话是通过唯一的会话id所驱动的。会话id是一个加密的随机数字,保证每个用户所分配到的id是唯一的。在整个会话的声明周期中都会保存在客户端,可以保存在用户机器的cookie中,也可以写在url中。
Session的两种实现方式
- 保存在cookie中
- 通过重写URL,将session id写入URL中。
3、PHP中的会话控制
环境配置
==启用 php.ini 中的session_auto_stray,但是无法使用对象作为会话变量,因为会话先于对象载入==。
开启会话:
session_start();
注册一个会话变量
$_SESSION[‘键名‘]=5
数组中的键可以自定义==会话变量可以由用户通过get或post传入==
销毁会话变量
- 销毁一个会话变量:
unset($_SESSION[‘myvar‘]);
- 一次性销毁全部会话变量:
$_SESSION = array()
$_SESSION = []
- 销毁一个会话变量:
销毁会话
session_destory()
4、session操作实质
session记录在服务端,对$_SESSION
的操作本质是服务器对session文件的操作。当客户端的访问请求中带有cookie时,服务器会从中取出session id并找到在硬盘上与id对应的session文件进行操作。
session_start();
- 为用户分配一个唯一的session id
- 在服务端生成一个格式为
sess_sessionId
的文件,其中存储会话过程中产生的数据。- 例:sess_oav9to18506jm6pokl1al5nus2
$_SESSION[‘time‘]=2000
在session文件中写入记录:time|s:4:"2000";
unset($_SESSION[‘time‘]);
在session文件中删除对应的记录
$_SESSION = array()
$_SESSION = []
因为$_SESSION是一个数组,对数组置空的行为会删除所有的会话变量,即清空session 文件中所有的内容
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])
- 不指定参数时返回会话名称,指定参数时可以修改会话名称。
- ==在 session_start()之前使用==
string session_id([ string $id] )
- 不指定参数时返回会话id,指定参数时可以修改会话id,即修改相对于的session文件名称。
- ==在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驱动
以上是关于PHP 会话管理的主要内容,如果未能解决你的问题,请参考以下文章