PHP使用session实现猜数字

需求

?随机生成或则准备一个数字,用户有10次机会可以猜中它。
那么问题来了,这个数字生成后要放在哪里。放在cookie还是session,或则文件(txt/json)?放在文件的话,如果多个用户访问,都读取同一文件,那是不可行的。–先来讲讲“远古时代”;也就是对cookie和session的理解

cookie和session的区别

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上。
  2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
    考虑到减轻服务器性能方面,应当使用COOKIE。
  4. 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;

cookie

Cookie是服务器存储在本地计算机上的小块文本,并随每个请求发送到同一服务器。 IETF RFC 2965 HTTP状态管理机制是一种通用的cookie规范。 Web服务器使用HTTP标头将cookie发送到客户端。在客户端终端,浏览器解析cookie并将其保存为本地文件,该文件自动将来自同一服务器的任何请求绑定到这些cookie。

具体来说,cookie机制使用一种在客户端维护状态的方案。它是客户端会话状态的存储机制,他需要用户打开客户端的cookie支持。 Cookie的作用是解决HTTP协议中缺少无状态缺陷的问题。

Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准。由于HTTP是一种无状态协议,服务器但从网络连接无法知道客户身份,就给客户端颁发一个通行证,每人一个,无论谁访问都得携带自己都通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
PHP使用session实现猜数字_第1张图片
COOKIE实际上是一小段文本信息。客户端请求服务器,如果服务器需要记录该用户状态;就是用response向客户端浏览器颁发一个cookie。客户端浏览器会把cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
PHP使用session实现猜数字_第2张图片

session

当程序需要为客户端的请求创建会话时,服务器首先检查客户端的请求是否包含会话标识符(称为会话ID)。如果包含它,它先前已为此客户端创建了一个会话。服务器根据会话ID检索会话(无法检索,将创建新会话),如果客户端请求不包含会话ID,则为客户端创建会话并生成与会话关联的会话ID。 session id应该是一个既不重复也不容易被复制的字符串。会话ID将返回给客户端以保存此响应。

session技术是服务端的解决方案,是通过服务器来保持状态的。我们通常都会把Session翻译成会话,因此我们可以把客户端浏览器与服务器之间一系列交互的动作称为一个 Session。使用session第一步当然是创建它了;服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。正式这样一个过程,用户的状态也就得以保持了。
那么多的文字…还是用一张图片来说明吧,我画的图贼能增加印象
PHP使用session实现猜数字_第3张图片

PHP使用cookie

  1. 设置响应头,可以给客户端发“证书”
header('Set-Cookie: foo=bar');
  1. setcookie 是专门用于设置 cookie 的函数
setcookie('key', 'value');
  1. 删除(原理:设置过期时间为一个过去的时间)
setcookie('key','value',time());
  1. 其它
    PHP使用session实现猜数字_第4张图片
  2. 查看
setcookie('key1', 'value1', time() + 1 * 24 * 60 * 60, '', '', false, true);

PHP使用session实现猜数字_第5张图片
关联数组的方式访问客户端提交过来的 Cookie

var_dump($_COOKIE);
  1. 使用cookie生成一个随机

if (empty($_COOKIE['num']) || empty($_GET['num'])) {
    $num = rand(0, 100);
    setcookie('num', $num);
}
?>

最后生成这个数字用户可以查看到,那么没有任何的意义。用户连猜都不不用猜。如果将数字存入我们的文件里面;那么多个用户猜同一个数字;也是不可行的;或许如果加密解决cookie的值;让用户看不懂;但如果用户直接禁用…不久玩不下去了…你又张良计,我有过墙梯

file_put_contents('number.txt', $num);

php使用session

Session对象是在客户端第一次请求服务器的时候创建的。Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。这样完美可以解决我们的需求


// 用户访问时,没有session创建session,让用户有一个独立的session
session_start();
$_SESSION['key1'] = 'value1';

id
获取

var_dump($_SESSION);

通俗讲,当用户需要存放手机,它需要一个箱子;那么,没有箱子开箱子(session_start()),并且生成一个条形码(sessionid)给用户;用户下次来利用条形码开箱子(发送请求带上sessionid)

使用session实现猜数字

html结构,当然可以加一些css样式

<h1>猜数字游戏h1>
<p>Hi,我已经准备了一个 0 - 100 的数字,你需要在仅有的 10 机会之内猜对它。p>
<form action="'PHP_SELF'];?>" method="get">
    <input type="number" min="0" max="100" name="num" step="1" placeholder="随便猜">
    <button type="submit">试一试button>
form>

我们可以采取混编的模式,可以对用户提示信息

 if(isset($GLOBALS['msg'])): ?>
<div> echo $GLOBALS['msg'];?></div>
 endif;?>
  1. 当用户访问网站,服务器创建一个session;生成一个随机数保存起来(如果已经生成该随机数不用保存了)
  2. 将服务器生成的和用户点击提交的数字进行对比
  3. 猜对猜错提示信息

session_start();
// 1.判断是否已经在session产生了随机数或则是重新请求网址
if(empty($_SESSION['num']) || empty($_GET['num'])){
    $num = rand(0,100);
    $_SESSION['num'] = $num;
    var_dump($num);
}else{
 // 2.获取用户选择的数,将拿到的数与选择的数做比较
    $result = (int)$_SESSION['num'] - (int)$_GET['num'];
    if($result==0){
        $GLOBALS['msg'] = '你猜正确了,获得iPhone X...手机套一个';
    }else{
        $GLOBALS['msg'] = '请继续猜';
    }
}
?>
  1. 由于有限制次数,所以我们还要考虑次数
  2. 当然还要对次数和随机数进行重置

session_start();
// 1.判断是否已经在session产生了随机数或则是重新请求网址
if(empty($_SESSION['num']) || empty($_GET['num'])){
    $num = rand(0,100);
    $_SESSION['num'] = $num;
    var_dump($num);
}else{
 // 2.获取用户选择的数,将拿到的数与选择的数做比较
    $result = (int)$_SESSION['num'] - (int)$_GET['num'];
    $count = empty($_SESSION['count'])?0:$_SESSION['count'];
    if($count>=10){
        $GLOBALS['msg'] = '你的十次机会已经用完';
        unset($_SESSION['num']);
        unset($_SESSION['count']);
    }else{
        if($result==0){
            $GLOBALS['msg'] = '你猜正确了,获得iPhone X...手机套一个';
            unset($_SESSION['num']);
            unset($_SESSION['count']);
        }else{
            $_SESSION['count'] = $count+1;
            $GLOBALS['msg'] = '请继续猜';
        }
    }
}
?>

参考文档

理解cookie和session机制
理解cookie和session机制
官方解析
session

你可能感兴趣的:(PHP)