PHP中的cookie 基础和应用

一、原理

cookies 和 session 是 web 开发中比较重要的知识点,在编程中都是贯穿始终的。

会话可以简单理解为,用户打开一个浏览器,点击多个超链接,访问服务器多个 web 资源,然后关闭浏览器,整个过程称之为一个会话

每个用户在使用浏览器与服务器进行和会话的过程中。都会产生一些数据。比如购物车,每个用户查看购物车的时候,都能看到自己的选择,但是他们用的都是一套系统(简单的说都是访问的后台的相同 php 文件),那么如何才能让不同的人看到自己的购物车里面的内容呢。

思路:保存在数据库里面, 这是一个不错的方案,它的优缺点我们在后面再讨论。还有那么一些视频网站,可以保存你上次看过电影 (在你还没有登陆的时候),如何解决?

二、基础知识

这里先讲解一些会话技术的相关基础知识。

1 会话技术

  • cookies
  • session

这两个东西是有千丝万缕的联系的,我们先讲 cookies 然后讲 session.

session 与 http 协议有着莫大的关系,如果你之前了解 http 协议的话,你会有一个深入的了解,如果没有基础也没关系。

比如 https://www.baidu.com 前面为什么要加 https?是因为在网络传输中有着各种各样的协议,就像双方(发送方和接受方)达成约定。我们开始吧。

2 分析

大家在访问某个网站的时候,是否能看到提示你上次登陆网站的时间,比如一些银行,邮箱,或者 qq,都会提示你曾经在什么时候登陆过。如何实现的? 还有在浏览比如淘宝京东的时候,提示你上次浏览的商品有哪些,不同用户浏览过的商品肯定不一样,这是怎么实现的呢?

如何提示用户上次登录网站的时间。如何保存上次用户浏览的信息,如何保证用户在一定时间内,不用反复登陆。

3 cookie

在英文中是小甜饼的意思,它是一种客户端技术,服务器把每个用户的数据以 cookies 的形式写给用户各自的浏览器。哈哈~平时是不是经常在浏览器中看见清除(cookies) 之类的提示啊。当用户通过一个浏览器再去访问服务器中的 web 资源时,就会带着各自的数据区,这样!web 处理的就是用户各自的数据了!

服务器在客户端保存用户的信息,这些信息就像是小甜饼一样,数据量并不大,服务器端在需要的时候可以从客户端读取,保存在客户端的浏览器缓存目录下,都很小!!一般在 2~3k 之内。通过 set-cookie 的 HTTP 协议获取。

4 cookie 的作用

保存上次登陆时间信息等等,保存用户名,密码,在一定时间不用重新登陆,记录用户访问网站的喜欢,比如 google 打开首页,自定义首页。

三、实验步骤

1 cookies 在浏览器的保存

cookie 在客户机的某一个目录,根据你的浏览器,会有不同的保存方式,保存的路径还与操作系统有关。

这里我们以实验楼 linux 系统 火狐浏览器为例子。(Windows 下自行搜索)进入 firefox 的目录(需要先打开一次浏览器)。

cd ~/.mozilla/firefox #然后进入第二个文件夹(不同环境可能有所区别)

可以看到里面有个 cookie.sqlite 文件,这个是一个数据库格式文件,可见 Firefox 将 cookie 数据存入了数据库。 我们可以开打火狐浏览器查看具体的 cookie 信息:

可以看见里面有各种站点显示的文件。其实就是键值对的字符串。

接下来我们来写一个用 PHP 操作 cookie 的示例,可以在 

php 手册 http://php.net/manual/zh/features.cookies.php 中查看更多关于 cookie 的讲解和用法。

2 PHP 操作 cookie

2.1 cookie 的存取

1、开启 Apache 服务器

service apache2 start

2、进入 Web 根目录

cd /var/www/html

3、修改读写权限

sudo chmod -R 777 /var/www/html

4、新建 cookie1.php,写入以下代码

<?php  
//演示如何创建cookies信息
//把用户名和密码保存在客户端的cookies
//这个函数用来保存cookie
//key--value的形式保存
setcookie("name","shiyanlou",time()+3600);
echo "success!";
?>

5、浏览器测试

打开 Firefox 浏览器,输入地址:localhost/cookie1.php。

输出 success!,说明我们的 cookie 信息已经被成功写入。按照上面的流程,查看此时浏览器中全部 cookie 信息,就会发现了多个一条记录:

因为我们这里只有一个请求,所以还可以通过另外一种方式查看 cookie 信息:

这是它的一个初步使用.

注意保存多少时间是 time ()+3600,time () 是当前的 Unix 时间戳。

代码说明:

  • 当浏览器访问 cookie1.php 页面的时候,我们的服务器就会以 Set-Cookie:name=xxx;expires=xxxx 回送 http 响应,当浏览器获取到该信息后,就会保存该 cookie 到新的 xxx 文件;
  • 如果我们没有时间参数 cookie 不会保存到客户端,当浏览器的会话结束,我们的 cookie 就会失效;
  • cookie 保存的信息形式:键值对形式,客户端可以保存多个键值对;
  • cookie 可以保存中文,但是会进行 urlencode 编码;
  • cookie 可以有多个键值对 (而 session 是统一的),还可以给不同的键值对指定不同的有效时间。

把 cookie 取出来 (超时之后就取不出来了)

新建 cookie2.php:

//cookie2.php
<?php
//获取cookie信息
echo "<pre>";
print_r($_COOKIE);
echo "<pre>";
$name=$_COOKIE['name'];
echo "name".$name;
?>

因为在 cookie1.php 中,我们将 cookie 的有效时间设置为当前时间 + 3600s,即有效期为一小时。所以现在是能够取到的,为了方便测试,这里讲 cookie1.php 中 cookie 的有效期设置为 5s。当然,如果你愿意等一个小时的话,也是可以的。修改之后,执行 cookie1.php,等待 5s 之后,再执行 cookie2.php:

cookie 可以分别设置各个键值对保存的时间,如:

setcookie('name','shiyahlou',time()+100)
setcookie('age',10,time()+200).

2.2 cookie 过期

上面的代码说明了 cookie 过了有效期之后,就会失效,为什么呢?其实这个跟 http 协议有关,它发包的时候没有带 cookie 了 (因为超时过期了),http 协议规定要携带网站 cookie,所有 web 开发都遵循此规范。

这个机制是 http 协议规定的。

可以保存多个数据,使用明文方式!!所以如果用 cookie 来保存密码是非常危险的。

setcookie("name","passwd",time()+3600);
setcookies("name","shiyanlou1",time()+60); //这个值在一分钟后会过期setcookies("name","shiyanlou2",time()+3600);
setcookies("name","shiyanlou3",time()+3600);
setcookies("name","shiyanlou4",time()+3600);

2.3 cookie 的更新与删除

更新

如何更新 cookie 信息?首先必须是是针对一个用户,setcookie 会覆盖之前的记录,在 /var/www/html 目录下创建文件 cookie3.php ,编辑如下:

<?php
setcookie("name","shiyanlou",time()+300);
echo "name is shiyanlou! <br>";
//更新
setcookie("name","chengdu",time()+300);
echo "update record, name is chengdu";;
?>

自己可以试试哦,打开浏览器,输入 localhost/cookie3.php,再次查看 cookie 信息,发现果然变化了。

删除

其实删除数据是通过修改 cookie 的有效时间来实现的。

  • 删除指定键值
  • 删除所有键值对 指定删除某一个
    • key<==>val
    • 说白了其实就是减少它存在的时间,让保存时间过期,时间减少多少都可以

在 /var/www/html 目录下创建 cookie4.php ,编辑如下:

<?php
//删除指定键名cookie
setcookie("key","",time()-200);
//删除所有,当全部删掉的时候,文件夹也会被删掉
foreach($_COOKIES as $key => $val)
{
  setcookie($key, "", time()-1);
}
?>

3 项目实战

需求:登录页面信息展示

  • 显示上次登录的时间
  • 自动填写用户名和密码

具体分析:

  • 如果用户是第一次访问该页面,则提示 “您是第一次访问”
  • 如果不是第一次访问,则显示上一次登陆时间
  • 实现打开登陆界面,自动填写用户名
  • 首先在前端界面添加一个复选框

3.1 显示上次登录时间

实现这个功能需要一个前端界面,一个后端数据处理。

前端页面:login.php

<html>
<head></head>
<body>
    <h1>Login In</h1>
    <form action="loginProcess.php" method="post">
        <table>
            <tr>
                <td>User id</td>
                <td><input type="text" name="id"/></td>
            </tr>
            <tr>
                <td>password</td>
                <td><input type="passwd" name="password"></td>
            </tr>
            <tr>
                <td><input type="submit" value="login"/></td>
                <td><input type="reset" value="reset"/></td>
            </tr>
        </table>
    </form>
</body>
</html>

后端逻辑:loginProcess.php

这段代码的作用就是检验 cookie 是否为空,为空则说明是第一次登陆,不为空则说明不是第一次登陆,就把上次登陆的时间打印出来。然后这一段代码可以封装成为一个函数,用的时候再 require 一次。

<?php
echo "welcome,  ".$_POST['id'].", login success!!";
echo "<br/><a href='login.php'>Back to login</a>";
if(!empty($_COOKIE['lastVist'])){
    echo "your last login time:".$_COOKIE['lastVist'];
    //更新时间
    setcookie("lastVist",date("Y-m-d H:i:s"),time()+24*3600*30); 
}else{
    //用户第一次登陆
    echo "you first login time:";
    setcookie("lastVist",date("Y-m-d H:i:s"),time()+24*3600*30);
}
?>

打开浏览器,输入地址:localhost/login.php。输入登录信息,就可以看到效果了。测试过程中,别忘了看看浏览器中 cookie 的变化。

四、实验总结

本次实验主要向大家介绍与 cookie 相关的基础知识,并使用 PHP 对 cookie 进行写入,读取,更新和删除操作,同时还了解了 cookie 的有效期的概念,通过实际的项目实践 PHP 对 cookie 的操作。更多关于 cookie 的知识和用法请查阅 PHP 手册。

五、最后

文章全部内容截选自实验楼教程【PHP 会话控制】,该教程总共 4 节内容,文章属于第一节内容,主要讲的是 PHP 中的 cookie 基础和应用;后面三节分别是:cookie 的实战应用、session 基础与实战、session 的实战应用,如果想要查看全部内容,点击【PHP 会话控制】即可~

本文转载自:https://www.shiyanlou.com/courses/436