欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP会话控制中session的使用

程序员文章站 2022-03-15 10:16:03
...

简单介绍

基本功能:

通过为每个独立用户分配唯一的会话 ID,可以实现针对不同用户分别存储数据的功能。 会话通常被用来在多个页面请求之间保存及共享信息。一般来说,会话 ID 通过 cookie 的方式发送到浏览器,并且在服务器端也是通过会话 ID 来取回会话中的数据。 如果请求中不包含会话ID 信息,那么 PHP 就会创建一个新的会话,并为新创建的会话分配新的 ID。【摘自官方文档】

简单来说其作用类似于cookies但是相比较cookies更加安全。cookies保存在用户的浏览器上,用户可以非常方便的更改,然而session保存在服务器,用户只会拿到一个ID(session_id)号因此用户不能直接修改session中保存的信息。

工作流程

当开始一个会话时,PHP 会尝试从请求中查找会话 ID (通常通过会话 cookie), 如果请求中不包含会话 ID 信息,PHP 就会创建一个新的会话。 会话开始之后,PHP 就会将会话中的数据设置到 $_SESSION 变量中。 当 PHP 停止的时候,它会自动读取 $_SESSION 中的内容,并将其进行序列化, 然后发送给会话保存管理器来进行保存。PHP 脚本执行完毕之后,会话会自动关闭。 同时,也可以通过调用函数 session_write_close() 来手动关闭会话。 【摘自官方文档】

①接受用户请求,并查询ID(session_id)。
②如果ID(session_id)存在,则开始会话;如果不存在则创建一个新会话,之后开启会话
③PHP从会话中获取相关数据经过反序列化后保存到$_SESSION中。
④PHP结束前将$_SESSION经序列化后提交给管理器。
⑤结束会话。

常见配置
session.save_handler : 修改默认会话保存机制(默认状态是以文件形式保存到某个路径下,可以修改session_set_save_handler来把session保存到数据库)
session.save_path:session文件的保存位置。如图:
PHP会话控制中session的使用
session.auto_start : 会话自动开启,默认是0表示不开启,修改为1表示开启。PHP代码中可以调用session.start()手动开启。
session.name: session的名字,默认PHPSESSID
session.gc_maxlifetime: session的最长有效期,以ms为单位。如果超过这个时间sessio将自动删除。默认是1440(24分钟)
serialize_handler: 默认PHP,处理连续资料的方式,本功能只有WDDX模组或PHP内部使用【说人话就是用WDDX还是PHP格式来序列化得出session存储的字符串】注意如果这里的序列化方式是PHP那么就可能会出现反序列化漏洞。
session.gc_probability = n: 以千分之n的概率回收(删除)session

其他:Session 上传进度

当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,上传进度可以在$_SESSION中获得。

当 session.upload_progress.enabled INI 选项开启时,PHP 能够在每一个文件上传时监测上传进度。
这个信息对上传请求自身并没有什么帮助,但在文件上传时应用可以发送一个POST请求到终端(例如通过XHR)来检查这个状态

当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,上传进度可以在 S E S S I O N 中 获 得 。 当 P H P 检 测 到 这 种 P O S T 请 求 时 , 它 会 在 _SESSION中获得。 当PHP检测到这种POST请求时,它会在 SESSIONPHPPOST_SESSION中添加一组数据, 索引是
session.upload_progress.prefix 与 session.upload_progress.name连接在一起的值。
通常这些键值可以通过读取INI设置来获得

利用session实现登陆后在页面之间的切换

一共设置了五个页面
login.html

<!DOCTYPE html>
<html lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
	<meta name="Login" content="width=3, initial-scale=1.0">
	<title>Document</title>
</head>
<body>
	<form action="./login.php" method="post">
		<p>登录</p>
		<p>账号:<input type="text" name="name" id="" /></p>
		<p>密码:<input type="password" name="passwd" id=""/></p>
		<input type="submit" value="登录">
	</form>
</body>
</html>

login.php

<?php
	header("content-type:text/html;charset=utf-8");
	if($_POST['name']=='admin' && $_POST['passwd']=='passwd'){
		session_start();
		$_SESSION['user']['islogin']="true";
		$_SESSION['user']['username']=$_POST['name'];
		echo "<script>alert('登录成功');location='./index.php'</script>";
	}
	else{
		echo $_POST['name'];
		echo "登录失败!";
	}

index.php:

<?PHP
	session_start();
	header("content-type:text/html;charset=utf-8");
	//phpinfo();
	if(isset($_SESSION['user']['islogin']) && $_SESSION['user']['islogin'] == true){
		echo "Hi ".$_SESSION['user']['username'].",欢迎您的到来index.php!<br>";
		echo "<a href='a.php'>前往页面a</a><br>";
		echo "<a href='b.php'>前往页面b</a><br>";
		echo "<a href='logout.php'>退出登录</a><br>";
		print_r($_SESSION);

	}else{
		echo "你无权访问,请登录(3s后跳转。。。)";
		echo "<meta http-equiv='refresh' content='3;url=./login.html'/>";
	}

logout.php:

<?PHP
	session_start();
	header("content-type:text/html;charset=utf-8");
	//phpinfo();
	if(isset($_SESSION['user']['islogin']) && $_SESSION['user']['islogin'] == true){
		$_SESSION['user']=array();//把当前user幸喜置空
		setcookie(session_name(),null,time()-1,'/');//把存在cookie里的session_id给删了
		session_destroy();//删除服务器上的session(文件)
		echo "即将返回登录页面。。。";
		echo "<meta http-equiv='refresh' content='2;url=./login.html'/>";
	}else{
		echo "你无权访问,请登录(3s后跳转。。。)";
		echo "<meta http-equiv='refresh' content='3;url=./login.html'/>";
	}

a.php和b.php基本一致

<?php
	session_start();
	header("content-type:text/html;charset=utf-8");
	if(isset($_SESSION['user']['islogin']) && $_SESSION['user']['islogin'] == true){
		echo "Hi ".$_SESSION['user']['username'].",欢迎您的到来a.php!<br>";
		echo "<a href='index.php'>前往页面index</a><br>";
		echo "<a href='b.php'>前往页面b</a><br>";
		echo "<a href='logout.php'>退出登录</a><br>";
	}
	else{
		echo $_POST['name'];
		echo "你无权访问该页面!";
	}
相关标签: php session