本节将详解讲解PHP中的cookie。
什么是cookie?
由于HTTP协议本身是无状态的,每次请求都是独立的,服务器无法识别连续的请求是否来自同一用户。这导致无法实现购物车、用户登录等需要保持状态的功能。为了解决这个问题,网景公司在1994年发明了Cookie技术,通过在客户端存储小量数据来实现会话跟踪。在现代Web开发中,通常结合使用Cookie和Session技术,其中Cookie存储Session ID,实际会话数据存储在服务器端,既保证了安全性又维持了状态。
cookie的本质是一段存储在客户机的中文本,在客户端发送请求时一起传输到服务器,通过cookie验证保持对话。
下面,我将向读者演示如何操作cookie:
1. 在PHP中,我们可以通过setcookie()函数来创建cookie:
setcookie()的语法格式如下:
/* setcookie的语法格式 */ bool setcookie( string $name, // Cookie名称(必需) string $value = "", // Cookie值 int $expires_or_options = 0, // 过期时间或选项数组 string $path = "", // 服务器路径 string $domain = "", // 域名 bool $secure = false, // 仅HTTPS bool $httponly = false, // 仅HTTP访问 string $samesite = "" // SameSite属性 )
下面,我们创建一个key="ck",value=“12345”,维持1小时会话,然后能够作用域全站的cookie,保存到test.php里。
<?php
// 创建cookie,有效期1小时
setcookie("ck", "12345", time() + 3600, "/");
// 参数说明:
// 1. cookie名称: "ck"
// 2. cookie值: "12345"
// 3. 过期时间: time() + 3600 (当前时间+3600秒)
// 4. 路径: "/" (全站可用)
?>进入test.php,然后F12查看cookie,发现我们刚才创建的cookie:

2. 我们说过,cookie是用来维持会话的,那么怎么进行cookie验证呢?要知道,cookie以键值对的方式存储在$_COOKIE超全局数组中,我们只需要通过isset()函数判断$_COOKIE["ck"]是否存在就能完成判断。
准备一个justify.php文件:
<?php
// isset()验证cookie
if (isset($_COOKIE['ck'])) {
echo "Cookie存在,值为: " . $_COOKIE['ck'];
} else {
echo "Cookie不存在!";
}
?>打开justify.php,我们会看到:

在test.php里创建的cookie存在,说明cookie验证成功。有读者可能疑惑客户端明明没有发送数据啊,这里justify.php为什么会检查到cookie呢?
首先我们要知道,我们在test.php里设置了cookie,当我们访问test.php时,cookie就已经存储在我们的浏览器中了;当我们访问justify.php时,访问会携带cookie到justify.php,此时justify.php验证到cookie(key=='ck',value=='12345'),所以完成if语句,打印“Cookie存在,值为: 12345”。
3. 怎么删除cookie?
3.1 PHP脚本通过setcookie删除:
在test.php中,我们写入:
<?php
// 创建cookie,有效期1小时
setcookie("ck", "12345", time() + 3600, "/");
// 参数说明:
// 1. cookie名称: "ck"
// 2. cookie值: "12345"
// 3. 过期时间: time() + 3600 (当前时间+3600秒)
// 4. 路径: "/" (全站可用)
?>
<?php
/* 删除cookie */
setcookie("ck","", 0,"/");
?>通过给值赋空字符、有限时间改为0来实现cookie的删除。
3.2 客户端浏览器手动删除

通过justify.php进行验证:

总结:当下浏览器会话主要通过session+cookie的方式进行,Session将数据存储在服务器端,仅通过Cookie传递一个Session ID作为"钥匙",存储敏感数据如登录凭证等,两者协作共同解决HTTP协议无状态问题,Session提供安全性,Cookie提供识别机制。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程