PHP13 会话控制
学习要点
- 会话控制使用的意义
- 用户跟踪方式
- Cookie的设置、读取以及删除
- Session的设置、读取以及删除
- 自定义session处理方式
会话控制
什么是会话控制
实现服务器跟踪同一个客户端的连续请求。包含两方面内容:
- 在一个网页中跟踪用户
- 在多个网页之间共享数据
会话跟踪的方式
HTTP是无状态协议,不能维护两个事务之间的状态。
PHP提供了三种会话跟踪方式:
- 超链接、隐藏域或者header()函数重定向。
- Cookie方式,将用户状态信息保持在客户端。
- Session方式,将用户状态保存在服务器。
简单参数的交互,采用第一种的方式的url的get或者http的post方式实现。
网页需要判断用户信息,一般采用Cookie或者Session技术。
Cookie
Cookie概念
cookie是Web服务器保存在客户端的一系列文本信息
cookie的作用:对特定对象的追踪、统计网页浏览次数、简化登录
安全性:容易信息泄露
Cookie的设置
- 通过setCookie()函数创建Cookie()。
Cookie信息是HTTP信息头的一部分,因此SetCookie()函数必须在其他信息被输出到浏览器前被调用。
header()函数和setCookie()函数:必须在任何实际输出之前调用,不管是普通的 HTML 标签,还是文件或 PHP 输出的空行,空格。
- 语法格式说明
bool setcookie(name,value,expire,path,domain,secure)
- 示例代码
//cookie常用三个参数设置 setcookie("userName","admin",time()+5*60); //cookie全参数设置:cookie只在action目录和其子目录有效,子域名有效,仅https中设置cookie setcookie("userName","root",time()+5*60,"/action",".example.com",1);
Cookie的读取
- 计算机中Cookie的保存位置:
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Cookies
- 通过$_COOKIE读取Cookie,示例代码:
print_r($_COOKIE);
Cookie数组的设置和读取
将多个键值信息保存在相同的Cookie名称标识下。
示例:
设置cookie
setcookie("user[name]","admin"); setcookie("user[pwd]",md5(123456)); setcookie("user[id]","administrator group");
读取cookie:
//print_r($_COOKIE); foreach ($_COOKIE["user"] as $key=>$value){ echo $key.":".$value.'<br>'; }
删除Cookie
- Setcookie(cookie名称)
删除同名cookie
- Setcookie(cookie名称,time()-1)
设置cookie已过期状态。默认cookie生命周期与浏览器生命周期一致。
使用Cookie实现用户登陆跟踪
- 登陆页面代码:
<?php error_reporting(0); /**清除cookie*/ function clearCookies() { setcookie ( "userName", '', time () - 1 ); setcookie ( "isLogin", '', time () - 1 ); } /**登陆与退出判断*/ if ($_GET ["action"] == "login") {//登陆 clearCookies (); if ($_POST ["userName"] == "admin" && $_POST ["password"] == "8888") { setcookie ( "userName", $_POST ["userName"], time () + 7 * 24 * 60 * 60 ); setcookie ( "isLogin", "1", time () + 7 * 24 * 60 * 60 ); header ( "location:index.php" ); } else { die ( "用户名或者密码错误" ); } } else if ($_GET ["action"] == "logout") {//退出 clearCookies (); } ?> <html> <head> <title>用户登录</title> </head> <body> <fieldset> <legend>用户登录</legend> <form action="login.php?action=login" method="post"> <P>账号:<input type="text" name="userName"></P> <P>密码:<input type="password" name="password"></P> <p><input type="submit" value="登陆"></p> </form> <p></p> </fieldset> </body> </html>
- 网站首页代码:
<?php if (! (isset ( $_COOKIE ['isLogin'] ) && $_COOKIE ['isLogin'] == 1)) { header ( "location:login.php" ); exit (); } ?> <html> <head> <title>首页</title> </head> <body> <?php echo "您好:" . $_COOKIE ["userName"] . " "; ?> <a href="login.php?action=logout">退出</a> <p>内容......</p> </body>
上机练习1:使用用cookie实现免输入用户名密码登录
需求说明:登陆成功后,5分钟内再次访问登陆页面实现免输入账号密码登录。
Session
相关概念
- Session的中文译名叫做“会话”,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。
- Session通过SessionID来识别用户。PHP服务器生成SessionID,保持在tmp目录中,以文件形式存在。客户端以cookie或者url保存SessionID,每次用户访问的时候,通过检测客户端和服务器端的sessionid是否一致来确认同一用户。
- 当客户端禁用COOKIE时(点击IE中的“工具”—“internet="">Internet选项”,在弹出的对话框里点击“安全”—“自定义级别”项,将“允许每个对话COOKIE”设为禁用),session_id将无法传递,此时SESSION失效。不过php5在linux/unix平台可以自动检查cookie状态,如果客户端设置了禁用,则系统自动把session_id附加到url上传递。windows主机则无此功能。
- Sessoin将用户信息存储在服务器端。安全性高。
配置Session
- 打开php.ini文件中[Session]配置信息
session.auto_start = 0 ; #是否自动启动session,按照默认值方式。如果设置为1,则session无法存储对象。 session.save_handler = files ; #session的文件储存方式 session.save_path = /tmp ; #session的保存路径 session.use_cookies = 1 ; #使用cookie在客户端保存sessionid session.name = PHPSESSID ; #sessionid命名规则 session.cookie_lifetime = 0 ; #sessionid的cookie生存时间,0代表直到浏览器关闭 session.cookie_path = / ; #sessionid的cookie路径 session.cookie_domain = ; #sessionid的cookie域名 session.serialize_handler = php ; #使用PHP序列化机制 session.gc_maxlifetime = 1440 ; #session文件的保存时间
Session的声明与使用
- 启动session
bool seseion_start()
- 注册session
$_SESSION[];
- 示例代码
session注册对象类型数据需要注意:1、确认配置文件中的序列化和反序化机制已经配置;2、如果第1点没有配置,则使用serialize()和unserialize();3、注册和读取对象的脚本中需要引入对象的类脚本文件。
用户信息保存在session.save_path设定的目录下,文件名为:sess_sessionid,文件格式为:
变量名|类型:长度:值
例如:
userName|s:5:"admin";userID|i:1001;
Session的销毁与变量的注销
- 当使用完$_SESSION中的变量后,可以对其注销和删除。
当完成一个会话后,可将会话销毁。
- Session完全注销过程:
1、删除session变量:
逐个删除:unset($_SESSION[varname])
或者:
全部删除:$_SESSION=array();
2、删除客户端cookie中的sessionid:
Setcookie(session_name());
3、销毁服务器上存储的sesssion信息:
Bool session_destroy ( void )
示例代码:
//第一步:开启session并初始化 session_start(); //第二步:删除所有session变量,或使用unset($_SESSION[*])逐个删除 $_SESSION=array(); //第三步:删除基于cookie的session信息 if(isset($_COOKIE[session_name()])){ setcookie(session_name(),'',time()-1,'/'); } //第四步:销毁session session_destroy();
上机练习2:使用session实现用户的登陆跟踪
需求说明:
1、定义系统用户类,包含属性:账号、密码、是否是管理员
2、登陆成功后初始化用户:管理员对象和普通用户对象。将用户对象保存在session中,跳转到管理后台页面。
3、管理后台页面读取session中的用户信息,个性化显示用户网页内容。
Session的自动回收机制
- Session垃圾文件自动回收
如果客户端没有正常退出会话,服务器端保留的Session文件不会被删除。
如果没有被SessionID引用的服务器端Session文件,就成为“垃圾”Session文件。
PHP服务器根据session.gc_maxlifetime指定的时间去检测服务器中的session文件,如果session文件的修改时间大于这个时间,PHP服务器便会清除相应的session文件。
- 垃圾回收机制何时启动
每次执行session_start()函数就会启动php的垃圾回收机制,如果一个项目有多个页面,多个session_start()被频繁访问,则垃圾回收机制就会被频繁启动,影响系统性能。
可以通过设置php.ini来减少垃圾回收机制的启动频率。
推荐值:session.gc_probaility=1
推荐值:session.gc_divisor=[1000~5000]
垃圾回收启动频率= Session.gc_probaility/ Session.gc_divisor
本博客文章未经许可,禁止转载和商业用途!
如有疑问,请联系: 2083967667@qq.com