首页 > 编程笔记 > PHP笔记 阅读:3

PHP Cookie的创建和获取(附带实例)

HTTP 是无状态的协议,当用户请求网站的 A 页面后再请求 B 页面时,HTTP 无法判断这两个请求来自同一个用户,这就意味着需要有一种机制能够跟踪记录用户在网站的活动,这种机制就是会话技术。

Cookie 和 Session 是常用的两种会话技术,本节将对 Cookie 进行详细讲解。

Cookie简介

Cookie 是服务器为了辨别用户身份而存储在用户本地终端(浏览器)上的数据。

当用户第一次通过浏览器访问服务器时,服务器会向浏览器响应一些信息,这些信息都被保存在 Cookie 中。当用户使用浏览器再次访问服务器时,浏览器会将 Cookie 数据放在请求头中发送给服务器。服务器根据请求头中的 Cookie 数据判断该用户是否访问过,进而识别用户的身份。

为了更好地理解 Cookie,下面通过图 1 来演示 Cookie 在浏览器和服务器之间的传输过程。


图 1 Cookie的传输过程

当浏览器第一次请求服务器时,服务器会在响应数据中增加 Set-Cookie 头字段,将信息以 Cookie 的形式返回给浏览器;用户接收到服务器返回的 Cookie 信息后就会将它保存到浏览器中。当浏览器第二次访问该服务器时,会将信息以 Cookie 的形式发送给服务器,从而使服务器识别用户身份。

Cookie的基本使用方法

Cookie 的基本使用方法包括创建 Cookie 和获取 Cookie,下面进行讲解。

1) PHP创建Cookie

使用 setcookie() 函数创建 Cookie 的基本语法格式如下:
bool setcookie(
    string $name,            // Cookie的名称(必须)
    string $value = '',       // Cookie的值(可选)
    int $expire = 0,          // Cookie的有效期(可选)
    string $path = '',        // Cookie在服务器端的路径(可选)
    string $domain = '',      // Cookie的有效域名(可选)
    bool $secure = false,     // 指定是否通过安全的HTTPS连接传输Cookie(可选)
    bool $httponly = false   // 指定Cookie只能通过HTTP和HTTPS访问(可选)
)

下面在 cookie.php 文件中使用 setcookie() 函数创建 Cookie,示例代码如下:
<?php
setcookie('name', 'value');

通过浏览器访问 cookie.php,查看设置 Cookie 后的响应头信息,具体如下图所示:


图 2 查看设置Cookie后的响应头信息

设置 Cookie 后,浏览器会根据响应头信息中的“Set-Cookie: name=value”保存 Cookie,如图 2 所示。

在开发者工具中可切换到“Cookies”标签页,查看保存的 Cookie 信息,如下图所示:


图 3 查看保存的Cookie信息

在图 3 中,可以看到已经设置的 Cookie 的名称(Name)、值(Value)、域名(Domain)、路径(Path)和有效期(Expires)等详细信息。

2) PHP获取Cookie

使用超全局变量 $_COOKIE 可以获取 Cookie。在 Cookie.php 中获取 Cookie 的示例代码如下:
var_dump($_COOKIE);   // 输出结果:array(1) { ["name"]=> string(5) "value" }
从上述代码可以看出,使用 $_COOKIE 可以直接获取 Cookie 中存储的内容。

需要注意的是,当在 PHP 脚本中第一次使用 setcookie() 函数创建 Cookie 时,$_COOKIE 中没有 Cookie 数据,只有浏览器下次请求并携带 Cookie,才能通过 $_COOKIE 获取到 Cookie。

值得一提的是,超全局变量是系统预先设定好的变量,在脚本的全部作用域中都可以使用。

使用Cookie存储多个值或数组

在 Cookie 名称后添加“[]”用于存储多个值或数组,示例代码如下:
setcookie('user[name]', 'tom');
setcookie('user[age]', 30);
var_dump($_COOKIE);      // 输出结果:array(2) { ["user"]=> array(2) { ["name"]=>
string(3) "tom" ["age"]=> string(2) "30" } }

相关文章