PHP笔记:Cookie和Session应用

为什么要使用回话,PHP使用回话的三种方式

PHP会话机制是用于保持用户连续访问网站时的相关数据,以便能够根据用户的信息定制程序,增加站点的吸引力。在浏览网站时,访问的每一个页面都需要使用HTTP协议来实现。而HTTP协议是无状态的协议,当一个用户请求一个页面之后,再请求同一个网站上的其它页面时,HTTP协议不知道这两个请求是否是来自同一个用户,会被当作独立的请求,不会将这两次访问联系在一起。

会话机制能够允许服务器跟踪同一个客户端发出的连续请求。这样,就可以很容易的做到用户登录的支持,而不是在浏览一个网页时重复执行登录的动作。当然,除了使用会话在同一个网站中跟踪用户外,对同一个访问者的请求还可以在多个页面之间为其共享数据。

PHP提供3种会话机制:

  • (1)使用超链接或者header()函数等重定向方式
    通过在URL的GET请求中附加参数(查询字符串)的形式,将数据从一个页面传递给另一个页面中。也可以通过表单的隐藏域,将用户信息在提交表单时传递给其它页面。
  • (2)使用Cookie
    将用户的状态信息存储在客户端的计算机中,让其它程序能够通过存取客户端计算机的Cookie,来存取用户信息。Cookie是存储在客户端计算机中的一个文本文件,包含一组字符串。当用户访问网站时,PHP会在用户的计算机上创建一个文本文件,把用户信息保存在其中,作为持续跟踪用户的一种方式。Cookie信息一般不加密,存在泄漏风险。为了防止类似的问题,Cookie设置了一套机制只允许客户端Cookie被创建它的域读写,其他浏览器或者网站都无法读写Cookie文件。此外,Cookie文件是临时文件,默认情况下,当用户离开网站时就会被自动删除。但可以通过脚本,让一些文件长久保存,当用户再次访问站点时,可以继续进行读取操作。虽然Cookie可以长期保存在客户端浏览器中,但也不是一成不变。一般而言,浏览器最多允许存储300个Cookie文件,而且每个Cookie文件支持最大容量为4KB。每个域名最多支持20个Cookie。
  • (3)使用Session
    将访问者的状态信息存放于服务器之中,让其它程序能够通过服务器中的文件或者数据库,来存取用户信息。Session会话保存的数据在PHP中是以变量的形式存在,创建的会话变量在声明周期中可以跨页引用。由于Session会话是存储在服务器端的,相对安全,也没有存储长度的限制。在PHP中Session表示服务器与客户端之间的一个会话,它从用户点击进入站点开始,到用户离开网站结束。也可以使用PHP提前,主动结束会话,终止Session对象的运行。PHP默认Session是基于Cookie的,Session ID被服务器存储在客户端的Cookie中。Session会话具有针对性,不同的用户拥有不同的会话。一旦进入网站,PHP都会自动为每一个用户建立独立的Session对象,Session对象通过session_id属性进行标识,每一次会话都会生成一个永不重复的随机值。用户在网站内只能访问自己的Session,而不能访问其它用户的Session。使用Session可以存储用户信息,如用户姓名,访问时间,访问页面,以及每个页面的停留时间等,通过这些基本信息能够统计出用户的浏览习惯、个人爱好等。Session适合存储少量信息,不能长期存储。如果要长期存储,建议把Session信息存储到服务器端的文件或者数据库。

PHP操作Cookie和Session的应用

Cookie实现控制登录时间(通过确保客户端的Cookie存活时间来确保登录有效时间)

在这里插入图片描述
index.php

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h2>用户登录</h2>
<form name="form1" method="post" action="index_ok.php">
    <p> 用户名:
        <input name="user" type="text" size="20">
    </p>
    <p>&nbsp;&nbsp;&nbsp;码 :
        <input name="pass" type="password" maxlength="20">
    </p>
    <p>
        <input type="submit" name="Submit" value="提交">
    </p>
</form>
</body>
</html>

index_ok.php

<?php
header( "Content-type: text/html; charset=UTF-8" ); //设置文件编码格式
if($_POST['user']!="" && $_POST['pass']!="")
{
 if($_POST['user']=="admin" && $_POST['pass']=="admin")
 {
  setCookie("user",$_POST['user'],time()+5)or die("禁止cookie");//将用户名保存到客户端Cookie中
  setCookie("pass",$_POST['pass'],time()+5)or die("禁止cookie");//将密码保存到客户端Cookie中
  echo "<script>alert('登录成功!'); window.location.href='cookie.php';</script>";
 }
 else
 {
  echo "<script>alert('用户名或者密码不正确!'); window.location.href='index.php';</script>";
 }
}else{
 echo "<script>alert('用户名或者密码不能为空!'); window.location.href='index.php';</script>";
}
?>
setcookie(name,value,expire,path,domain,secure)

setcookie()函数参数说明

参数说明
name必须,定义Cookie的名称
value必须,定义Cookie的值
Expire可选。定义Cookie的有效期,此处time()+5表示5秒后Cookie过期,需要重新登录
path可选,定义Cookie的服务器路径
domain可选,定义Cookie的域名
secure可选,定义是否通过安全的HTTPS连接来传输Cookie

在PHP中使用$_COOKIE预定义变量读取setcookie()函数设置的Cookie名称

$_COOKIE['user']=="admin" && $_COOKIE['pass']=="admin"

cookie.php

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h2>登录提示</h2>
<?php
 if($_COOKIE['user']=="admin" && $_COOKIE['pass']=="admin")
 {
  echo "欢迎".$_COOKIE['user']."光临!";
 }else
 {
  echo "<script>alert('COOKIE已经过期,请重新登录'); window.location.href='index.php';</script>";
 }
?>
</body>
</html>

输出:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Cookie实现自动登录(判断客户端中是否存在用户名Cookie和密码Cookie,若存在,表示非首次登录,可以不输入用户名和密码,直接提交登录)

如果用户是第一次登录,则需要填写用户名密码。如果是再次登录,那么就不需要输入用户名和密码,因为$_Cookie会从Cookie中读取这些信息,用户直接单击登录按钮即可。登录成功之后进入main.php页面
在这里插入图片描述
index.php

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h2>自动登录</h2>
<form id="form1" name="form1" method="post" action="index_ok.php">
    <p>登录名称:
        <input name="name" type="text" class="txt" id="lgname" value="<?php if (! empty ( $_COOKIE['name'] )) echo $_COOKIE['name'];?>" size="20">
    </p>
    <p>登录密码:
        <input name="pwd" type="password" class="txt" id="lgpwd" value="<?php if (! empty ( $_COOKIE['pwd'] )) echo $_COOKIE['pwd'];?>" size="20">
    </p>
    <p>保存时间:
        <input name="times" type="radio" value="3600" checked="checked">
        1小时
        <input type="radio" name="times" value="86400">
        1</p>
    <p>
        <input type="submit" name="Submit" value="提 交">
        <input type="reset" name="reset" value="重 置">
    </p>
</form>
</body>
</html>

index_ok.php

<?php
header("Content-type: text/html; charset=UTF-8");  //设置文件编码格式
if (! empty ( $_POST ['name'] ) and ! empty ( $_POST ['pwd'] )) 
{ //判断用户名和密码是否为空
 if ($_POST ['name'] == "admin" && $_POST ['pwd'] == "admin") //如果有设置表单对象name以及pwd的话,再进行客户端Cookie的设置
 {
  setcookie ( "name", $_POST ['name'], time () + $_POST ['times'] ); //设置cookie有效时间为1小时,将用户名保存到客户端Cookie中
  setcookie ( "pwd", $_POST ['pwd'], time () + $_POST ['times'] ); //设置cookie有效时间为1小时,将密码保存到客户端Cookie中
  echo "<script>alert('succeed!');window.location.href='main.php';</script>";
 } 
 else 
 {
  echo "<script>alert('false!');window.location.href='index.php';</script>";
 }
} 
else //若文本输入框为空,则判断客户端是否设置了用户名Cookie和密码Cookie
{
 if($_COOKIE['name']=="admin" && $_COOKIE['pwd']=="admin")//即客户端已经存在Cookie,则直接空用户名和空密码可以登录
 {
  echo "<script>alert('succeed!');window.location.href='main.php';</script>";
 }
 else
 {
  echo "<script>alert('用户名和密码不能为空!');window.location.href='index.php';</script>";
 }
}
?>

main.php

<?php
if($_COOKIE['name']==""){   //根据Cookie的值,判断浏览者是否具有访问该页面的权限
 echo "<script>alert('您不具有访问该页面的权限!'); window.location.href='index.php';</script>";//如果不具有,输出请您正确登录,并跳转到登录页面
}else{       //如果正确则输出主页内容
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h2>登录提示</h2>
<p><?php echo $_COOKIE['name'] ?> 成功登录</p>
</body>
</html>
<?php 
}
?>

输出:
在这里插入图片描述
在这里插入图片描述
若直接登陆过,接下来在相应Cookie时间内,可以不输入用户名和密码登录
在这里插入图片描述

Session通过Cookie传递Session ID实现限制访问时间(只适用于客户端没有禁用Cookie的情况)

在这里插入图片描述
index.php

<?php
 if(!isset($_SESSION)){ //$_SESSION如同$_POST、$_GET 或者$_COOKIE 等一样成为超级全局数组,但是该数组只有在调用session_start()函数之后才能使用
 session_start(); 
} 
$session_id=session_id();   //不同客户端访问获取的服务器分配的SessionID不同
setcookie("start",$session_id,time()+10);//将服务器分配的SessionID在客户端以Cookie(创建一个名为start的Cookie名称保存)形式保存,该Cookie在客户端存活10秒
echo $session_id;//打印服务器端跟踪客户端的sessionid
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<?php
 if(isset($_COOKIE['start']) && $_COOKIE['start']==$session_id){//服务器脚本查看客户单Cookie名称内容是否对应同一个SessionID,若是则判断是同一个用户
?>
<img src="images/index.jpg"><!--假设允许已登录的用户,即分配了SessionID的客户端访问首页-->
<?php
 }else{
?>
<img src="images/login.jpg"><!--若判断客户端的Cookie没有存储一个SessionID,只能访问登录页面。-->
<?php
}
?>
</body>
</html>

第一次访问index.php输出:
在这里插入图片描述
10s内快捷键F5刷新同一页面输出:

在这里插入图片描述
10s后快捷键F5刷新同一页面输出:
在这里插入图片描述
执行index.php脚本后,Session对象就会被保存在服务器端的某个文件中。该文件的位置时通过php.ini文件的session.save_path属性指定的目录下。如我的环境下:

session.save_path = "F:/WAMP_Environment/PHP7.1/tmp"

到该目录下查看可以看到:
在这里插入图片描述
可以看到每个Session文件以每个客户端的SessionID来命名,由于我们没有为Session指定Session变量,类似如下,所以该文件为空。

$_SESSION["username"]="root";//注册Session变量,赋值为一个用户的名称
$_SESSION["password"]="123456";//注册Session变量,赋值为一个用户的密码

否则的话,我们打开该文件应该显示:

username|s:4:"root";password|s:6:"123456";

格式为:变量名|类型:长度:值;变量名|类型:长度:值

客户端也可以查看Cookie,如我的IE浏览器在

C:\Users\xxxx\AppData\Local\Microsoft\Windows\INetCache

所有Cookie都被存放在客户端临时文件中,存放Cookie的文本文件的命名规则为:

用户名@网站名

文件类型为Cookie。我们打开一个却显示:

Cookies are no longer stored in files.  Please use Internet*Cookie* APIs to access cookies.

意思是要使用Cookie相关API才能查看,我又用谷歌浏览器Chrome查看得到我index.php脚本设置的客户端浏览器Cookie信息。如下图:

在这里插入图片描述

利用Session保存验证码信息以及Cookie保存用户名以及密码实现用户注册例子

在这里插入图片描述
index.php

<!DOCTYPE>
<html>
<head>
<meta charset="utf-8">
<title>用户注册</title>
</head>
<body>
<h2>用户注册</h2>
<form name="form1" method="post" action="index_ok.php">
<br>
用户名:
<input name="name" type="text" value="<?php  if (! empty ( $_COOKIE['name'] )) echo $_COOKIE['name'];?>" size="15"><!--size 属性规定输入字段的宽度。用户名取决于客户端浏览器的Cookie的name变量是否存在,否则值为空-->
&nbsp;&nbsp;
<input name="check" type="submit" id="check" value="检测所填用户名是否被注册"><!--提交按钮1-->
   <br>
   <br>&nbsp;&nbsp;&nbsp;码: 
<input name="pwd" type="password" value="<?php if(!empty($_COOKIE['pwd'])) echo $_COOKIE['pwd'];?>" size="15"><!--size 属性规定输入字段的宽度。用户名取决于客户端浏览器的Cookie的pw变量是否存在,否则值为空-->
<br>
<br>
验证码:
<input name="ym" type="text" size="5">
<?php
 if(!isset($_SESSION))
 {
  session_start();//启用会话
 }
 $array=array(1=>"pic/1.jpg",2=>"pic/2.jpg",3=>"piv/3.jpg",4=>"pic/4.jpg",5=>"pic/5.jpg");
 $rand="";
 for($i=0;$i<4;$i++)
 {
  $rand.=rand(1,5)."|";//字符串变量$rand类似"4|3|1|1|"格式
 }
 $rands=explode("|",$rand);//将$rand字符串变量以"|"划分为一个个数组元素
 $rand=implode($rands);//将一个一维数组的值重新转化为字符串,此时,字符串变量$rand类似"4311"格式
 $_SESSION['ym']=$rand;//第一个Session变量:将验证码存储Session变量ym中
 for($b = 0;$b < 4;$b++)
 {
  echo "<img src=pic/".$rands[$b].".jpg>";//利用数组随机输出4张4位数的验证码图片
 }
?>
   <a href='index.php'>刷新</a> <br>
   <br> 
   &nbsp;&nbsp;
   <input type="submit" name="sub" value="注册" /><!--提交按钮2-->
   &nbsp;&nbsp;
   <input type="reset" name="res" value="重置" /> 
</form>
</body>
</html>

输出:
在这里插入图片描述
index_ok.php

<?php
 if(!isset($_SESSION))//初始化SESSION变量
 { 
  session_start(); 
 } 
 if(!empty($_POST['check']) && $_POST['check'])//判断用户是否提交了检查按钮,empty()函数检查一个变量是否为空
 {//检查提交按钮1的提交信息:用户名信息是否被占用
  if($_POST["name"]=="")
  {
   echo "<script>alert('用户名不能为空');location.href='index.php'</script>";
  }
  else if($_POST["name"]==$_COOKIE["name"])//若用户名与用户之前注册过$_COOKIE["name"]同值
  {
   echo "<script>alert('用户名被占用');location.href='index.php';</script>";
  }
  else//客户端要么没有该Cookie($_COOKIE["name"]),要么输入的用户名与$_COOKIE["name"]值不对应,此时需要在客户端设置Cookie
  {
   setcookie('name',$_POST ['name']);//没有传入第三个参数-Cookie有效期,当用户离开网站时该Cookie就会自动删除
   echo "<script>alert('用户名可用');location.href='index.php';</script>";
  }
 }
 if(!empty($_POST['sub']) && $_POST['sub'])//判断按钮的值,执行不同的操作,此处形式提交按钮需要执行的脚本
 {
  if($_POST['name']=="" || $_POST['pwd']=="" || $_POST['ym']=="")//判断注册信息是否为空
  {
   echo "<script>alert('注册信息不能为空');location.href='index.php'</script>";
  }
  if($_POST ['ym']==$_SESSION['ym'])//判断验证码是否正确,利用保存在服务器上的Session变量ym进行验证
  {
   setcookie('name',$_POST['name']);//由于提交按钮之前需要点击检查按钮验证是否是同一个用户,一般来说用户点击了提交就证明该用户是一个新用户,所以将用户名与密码以Cookie的形式保存在客户端
   setcookie('pwd',$_POST['pwd'],time()+60);//保证安全性,密码Cookie仅存在当前时间后的60秒
   echo "<script>alert('注册成功');window.location.href='main.php';</script>";
  }
  else
  {
   echo "<script>alert('验证码错误');</script>";
  }
 }
?>

注意:此此本不能缺少开始的几行,即初始化SESSION变量,Session的设置不同于Cookie,必须先启动,在PHP中必须调用session_start()函数,以便PHP核心程序将Session相关的内建环境变量预先加载至内存。session_start()有两个作用:一是开始一个会话,二是返回已经存在的会话。如果少了这一句,会在$_SESSION[‘ym’]这里出现逻辑错误,因为提取不出来Session变量ym的值,所以一直会报验证码错误。

main.php

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h2>用户注册成功!</h2>
<?php
 echo "用户名:".$_COOKIE['name']."<br>";
 echo "密&nbsp;&nbsp;码:". $_COOKIE['pwd'];
?>
</body>
</html>

整体输出效果:
在这里插入图片描述
在这里插入图片描述
F:\WAMP_Environment\PHP7.1\tmp\sess_752b7jaio0rf49li7gu2oegh4p的内容如下:
在这里插入图片描述
前面的username以及password是我在上一个限制访问时间的例子中的index.php文件中加上了

$_SESSION["username"]="root";//注册Session变量,赋值为一个用户的名称
$_SESSION["password"]="123456";//注册Session变量,赋值为一个用户的密码

由此可见,Session会话具有针对性,一旦用户进入网站,准确的说用户在网站文档根目录(/)开始,往子目录不管访问哪个php文件,PHP始终会为用户标识唯一的、独立的Session对象,Session对象通过session_id属性进行标识,服务器标识用户浏览器以session_id进行标识,只要该用户访问了该站点下的任意一个可以增加Session变量(如上面的username以及password)的php文件,都会在PHP引擎的tmp目录下建立以该用户session_id命名的文件,里面存放该用户的相关信息。

使用Session可以存储用户信息,如姓名、访问时间、访问页面,以及每个页面的停留时间,通过这些基本信息能够统计出用户的浏览习惯、个人爱好等。在用PHP开发购物车网页时,也可以利用Session作为购物车,记录已选购的每件商品以及相关信息。

浏览器也可以查看服务器分配给客户端的SessionID:
在这里插入图片描述

利用Session控制不同用户的用户级别以实现用户权限管理

在一个网站中,不同用户拥有不同的权限。比如以论坛类网站来说,管理员用户登录,可以在网站上发布公告信息;如果以普通用户登录则不可以,只能浏览论坛中的帖子。
在这里插入图片描述
index.php为前后台页面,表单提交目的地也为index.php同时设置Session变量,然后再由该页面的PHP脚本控制跳转到main.php,再在该页面内提取已定义Session的值,根据不同的值显示不同的图片,此处以图片的形式简化操作。

index.php

<?php
if(!isset($_SESSION))
{ 
    session_start(); 
} 
if(  ! empty ( $_POST ['sub'] ) &&  $_POST['sub']==true)
{
 if($_POST['user']!="" && $_POST['pwd']!="")
 {
  if($_POST['user']=="admin" && $_POST['pwd']=="admin")
  {
   $_SESSION['type'] = 0;
   echo "<script>alert('管理员登录成功!'); window.location.href='main.php';</script>";
  }
  else
  {
   $_SESSION['type'] = 1;
   echo "<script>alert('普通用户登录成功!'); window.location.href='main.php';</script>";
  }
  $_SESSION['user'] = $_POST['user'];
  $_SESSION['pwd'] = $_POST['pwd'];
 }else
 {
  echo "<script>alert('用户名和密码不能为空!'); window.location.href='index.php';</script>";
 }
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h2>用户登录</h2>
<form action="" method="post">
    用户名:
    <input type="text" name="user">
    <br>
    <br>&nbsp;码:
    <input type="password" name="pwd">
    <br>
    <br>
    <input type="submit"name="sub"value="确 定">
    &nbsp;&nbsp;
    <input type="reset"name="res"value="重 置">
</form>
</body>
</html>

main.php

<?php 
if(!isset($_SESSION)){ 
    session_start(); 
} 
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
 <?php 
    if($_SESSION['type']=="0")
 {
    ?>
  <img src="images/mes.jpg"><!--管理员用户具备发布公告信息功能的图片-->
 <?php
    }
 else
 {
    ?>
  <img src="images/for.jpg"><!--普通用户只有浏览功能的图片-->
 <?php
 }
 ?>
</map>
</body>
</html>

还是要再次提醒,欲使用$_SESSION必须先执行session_start();语句。
输出:
在这里插入图片描述
此时F:\WAMP_Environment\PHP7.1\tmp\sess_752b7jaio0rf49li7gu2oegh4p显示为:

username|s:4:"root";password|s:6:"123456";ym|s:4:"1413";type|i:1;user|s:2:"12";pwd|s:2:"12";

Session实现网站防刷计数器

在网站需要统计页面访问次数的时候,常常需要排除一些不符合要求的情况,比如说用户利用浏览器不断刷新页面,以提高访问次数的情况,接下来就是要解决这种情况。

在这里插入图片描述
首先创建counter.txt保存网站之前访问量,再客户端浏览器没有浏览访问index.php时,counter.txt的内容为:

579

index.php

<?php 
if(!isset($_SESSION)){ 
    session_start(); 
} 
if(!isset($_SESSION['temp']))//判断$_SESSION[temp]==""的值是否为空,其中的temp为自定义的变量
{ 
 if(($fp=fopen("counter.txt","r"))==false)
 { 
  echo "打开文件失败!";
 }
 else
 { 
  $counter=fgets($fp,1024);  //读取文件中数据
  fclose($fp);                    //关闭文本文件
  $counter++;                     //计数器增加1
  $fp=fopen("counter.txt","w");   //以写的方式打开文本文件
  fputs($fp,$counter);            //将新的统计数据增加1
  fclose($fp);    
 }                       //关闭 
  $_SESSION['temp']=1;      //登录以后,$_SESSION[temp]的值不为空,给$_SESSION[temp]赋一个值1
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h2>防刷计数器</h2>
<?php 
//输出数据库中的记录数
if(($fp=fopen("counter.txt","r"))==false){
 echo "打开文件失败!";
}else{
 $counter=fgets($fp,1024);//从文件中读取一行
 fclose($fp);
 echo "网站的访问量:$counter";  //输出中文字符
}   
?>
</BODY>
</html>

接着浏览器访问该页面,输出:
在这里插入图片描述
第一次访问时,计数器加一,即counter.txt文件的内容加一。此时不管怎么刷新,都只是580,因为我们修改counter.txt文件的前提是当前Session变量是否有值(此处我们设置为1),在我们第一次访问该页面时,服务器就已经给该浏览器分配了唯一的SessionID,并且设置了Session变量temp,可以在F:\WAMP_Environment\PHP7.1\tmp(我的目录下)查看:
服务器端
在这里插入图片描述
内容为:

temp|i:1;

客户浏览器端

在这里插入图片描述
我们重新打开浏览器,再次访问相同URL,服务器重新给浏览器端分配了一个新的SessionID,表示启动一个新的会话,此时Session变量temp不存在,计数器加一。
服务器端
在这里插入图片描述
客户浏览器端
在这里插入图片描述

Session实现设计网页换肤

在访问某些网站中,有些用户可以根据自己的喜好进行换肤,用户单击网页背景色,然后将参数保存到客户端Cookie或者浏览器Session,下一次再访问该网站时就可以根据上次设置的信息进行用户个性化的设置。
在这里插入图片描述
images文件夹下是一张宽度为240像素,高度为89像素的图像:
在这里插入图片描述
index.php

<!doctype html>
<html>
<head>
<meta charset="utf-8">
</style>
</head>
<?php
if(!isset($_SESSION)){
 session_start();
}
if(!empty($_GET['col'])){
 $_SESSION['bgcolor']=$_GET['col'];
}
?>
<body bgcolor="<?php if($_SESSION['bgcolor']==""){echo "white";}else{echo $_SESSION['bgcolor'];}?>">
<h2>选择一种背景色</h2>
<img src="images/1.jpg" width="240" height="89" border="0" usemap="#Map">
<map name="Map" id="Map">
    <area shape="rect" coords="4,3,27,26" href="index.php?col=0066FF">
 <area shape="rect" coords="30,3,58,26" href="index.php?col=0099ff">
 <area shape="rect" coords="64,3,87,26" href="index.php?col=00CCFF">
 <area shape="rect" coords="90,3,114,26" href="index.php?col=00ffff">
 <area shape="rect" coords="122,3,147,26" href="index.php?col=3300ff">
 <area shape="rect" coords="151,3,177,26" href="index.php?col=3233ff">
 <area shape="rect" coords="180,3,211,26" href="index.php?col=3366ff">
 <area shape="rect" coords="211,3,239,26" href="index.php?col=3399fe">
</map>
</body>
</html>

代码释疑:
HTML <map> 标签用于客户端图像映射,图像映射指带有可点击区域的一幅图像。在<img>标签中的usemap属性指定map标签的ip或者name属性,以建立<img>与<map>之间的关联,通过点击某块area热区,进行待查询字符串的URL跳转,此处还是跳转回本页面,只不过多了一个col参数(参数以及值显示在浏览器地址栏中必定是get请求),接着,在本页面中使用PHP预定义变量$_GET[‘col’]获取参数值,存放到当前Session会话的关联变量’bgcolor’中。此处还需要注意的是怎么获取每个<area>的coords属性的值,此处我使用了photoshop的功能,具体可以参考https://blog.csdn.net/weixin_42124234/article/details/103011873

输出:
在这里插入图片描述
注意:我们在index.php只实现了第一行的8个色块的热区跳转。此处我们单击第一行第一个色块,浏览器地址栏后增减:

?col=0066FF

表示提交给当前页面一个参数,利用PHP脚本的$_GET[]方法获取内容,并保存在当前Session文件夹:
在这里插入图片描述
在这里插入图片描述
内容为:

bgcolor|s:6:"0066FF";

此时服务器Session保存了当前颜色信息,接着我们在当前Chrome浏览器新开一个标签页面输入同样的URL,注意不是关闭浏览器再重新打开,输入相同URL访问,即使不加url查询字符串参数(url?xxxx=xxx),仍是显示上一个颜色设置页面。如果关闭浏览器再打开,则重新对浏览器客户端分配一个新的SeesionID,即开启一个新的会话,之前设置的Session变量bgcolor只是关联之前的SessionID。所以页面颜色显示为初始的白色。

Session的存在的生命期设置于php.ini文件中:
在这里插入图片描述
根据官方文档的解释为:
在这里插入图片描述

管理服务器端Session缓存

当第一次浏览网页后,页面的部分内容在规定的时间内就被存储在客户端的临时文件夹中,这样下次再访问相同的页面时,就可以直接读取缓存中的内容,从而提高网站的浏览效率。但若不定期处理浏览器的页面缓存文件,则会影响浏览器的运行速度以及客户端电脑的存储容量。同理,如果不对服务器端的Session缓存文件做定期清理,也会给服务器的运行带来压力。
在这里插入图片描述
此处的tmp文件夹用来代替php引擎的默认Session文件夹,也就是我本地的

F:\WAMP_Environment\PHP7.1\tmp

index.php

<?php
$path =  './tmp/';   //定义缓存文件的临时存储路径
session_save_path($path);  //设置缓存存储路径
session_cache_limiter('private');  //设置缓存方式
$session_cache = session_cache_limiter(); //开启缓存
session_cache_expire(30);     //定义缓存时间
$session_expire = session_cache_expire(); //设置缓存时间
if(!isset($_SESSION)){ 
    session_start(); 
} 
      //初始化SESSION变量
$_SESSION['cache'] = $session_cache;   //为SESSION变量赋值
$_SESSION['expire'] = $session_expire;
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h2>清理缓存</h2>
<?php
echo "<p>缓存限制为:<span style='color:red;font-size:30px'>".$session_cache."</span></p>";
echo "<p>缓存时间为:<span style='color:red;font-size:30px'>".$session_expire."</span>分钟</p>";
echo "<a href = 'index.php?cache=1'>清理缓存</a>";
if( ! empty( $_GET['cache'] ) && $_GET['cache'] == "1"){
 $_SESSION = array();
 session_destroy();
 echo "<script>alert('清理SESSION缓存成功');</script>";
}
?>
</body>
</html>

代码释疑:
(1)、session_cache_limiter ([ string $cache_limiter ] ) : string
参数cache_limiter用于设置缓存方式,其取值如下:

  • nochache:不设置缓存
  • private:私有方法
  • private nochache:私有方法,但不过期
  • public:公有方法

(2)、session_cache_expire ([ string $new_cache_expire ] ) : int
参数new_cache_expire为可选参数,设置SESSION的过期时间,单位为分钟。默认过期时间180分钟,即不设置参数的情况。

(3)、session_save_path ([ string $path ] ) : string
在服务器中,如果将所有用户的SESSION内容都保存在默认的临时文件夹中,会降低服务器的安全性(若黑客破解远程连接到你的电脑,找到大家都知道的默认文件夹,修改某用户的Session值,特别是Session中保存某用户购物车的情况)和效率(保存Session的默认文件夹存储在PHP引擎的文件夹下,若文件过大,则拖慢PHP的运行效率,打开服务器存储的站点会非常慢。)因此我们重新建立了一个tmp文件夹。

输出情况:
Chrome浏览器打开
在这里插入图片描述
同时在我们自定义的tmp目录下:

在这里插入图片描述
此时我们点击清除缓存超链接,我们自定义的tmp目录下针对当前会话的session文件被删除了,对应index.php代码第28行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值