PHP Session 和 PHP Cookies 附带示例

什么是 Cookie?

Cookie 是一个小型文件,最大尺寸为 4KB,由 Web 服务器存储在客户端计算机上。

一旦设置了 Cookie,后续的所有页面请求都会返回 Cookie 的名称和值。

Cookie 只能从其发布的域中读取。例如,使用域名 www.guru99.com 设置的 Cookie 不能从域名 career.guru99.com 读取。

互联网上的大多数网站都会显示来自其他域的元素,例如广告。提供这些元素的域也可以设置自己的 Cookie。这些被称为第三方 Cookie。

用户创建的 Cookie 只能被该用户看到。其他用户无法看到其值。

大多数 Web 浏览器都有禁用 Cookie、第三方 Cookie 或两者的选项。

如果是这种情况,PHP 会通过在 URL 中传递 Cookie令牌来响应。

下图说明了 Cookie 的工作原理。

What is Cookie

此处,

1) 用户请求一个存储 Cookie 的页面

2) 服务器在用户计算机上设置 Cookie

3) 用户后续的页面请求将返回 Cookie 的名称和值

为什么要以及何时使用 Cookie?

  • HTTP 是一种无状态协议;Cookie 允许我们使用存储在用户计算机上的小型文件来跟踪应用程序的状态。Cookie 存储的路径取决于浏览器。Internet Explorer 通常将它们存储在“临时 Internet 文件”文件夹中。
  • 个性化用户体验——通过允许用户选择他们的偏好来实现。后续请求的页面将根据 Cookie 中设置的偏好进行个性化。
  • 跟踪用户访问的页面

创建 Cookie

现在让我们看一下用于创建 Cookie 的基本语法。

<?php

setcookie(cookie_name, cookie_value, [expiry_time], [cookie_path], [domain], [secure], [httponly]);

?>

此处,

  • PHP 的 “setcookie” 是用于创建 Cookie 的 PHP 函数
  • “cookie_name” 是服务器在从 $_COOKIE 数组变量中检索其值时将使用的 Cookie 的名称。这是必需的。
  • “cookie_value” 是 Cookie 的值,也是必需的。
  • “[expiry_time]” 是可选的;它可用于设置 Cookie 的到期时间,例如 1 小时。时间使用 PHP time() 函数加上或减去大于 0 的秒数设置,即 time() + 3600 表示 1 小时。
  • “[cookie_path]” 是可选的;它可用于设置服务器上的 Cookie 路径。斜杠“/”表示 Cookie 将在整个域上可用。子目录会限制 Cookie 对子域的访问。
  • “[domain]” 是可选的,可用于定义 Cookie 访问层次结构,即 www.cookiedomain.com 表示整个域,而 www.sub.cookiedomain.com 则将 Cookie 访问限制在 www.sub.cookiedomain.com 及其子域。*请注意,只要总字符不超过 253 个字符,就可以拥有子域的子域。*
  • “[secure]” 是可选的,默认为 false。如果设置为 true,则用于确定 Cookie 是通过 https 发送还是通过 http 发送(如果设置为 false)。
  • “[Httponly]” 是可选的。如果设置为 true,则只有客户端脚本语言,即 JavaScript 无法访问它们。

注意:php set cookie 函数必须在 HTML 开始标签之前执行。

现在让我们看一个使用 Cookie 的例子。

我们将创建一个基本程序,允许我们将用户名存储在一个将在十秒后过期的 Cookie 中。

下面的代码显示了上面示例“cookies.php”的实现。

<?php
     setcookie("user_name", "Guru99", time()+ 60,'/'); // expires after 60 seconds
     echo 'the cookie has been set for 60 seconds';
?>

输出

the cookie has been set for 60 seconds

检索 Cookie 值

创建另一个名为“cookies_read.php”的文件,其中包含以下代码。

<?php
     print_r($_COOKIE);    //output the contents of the cookie array variable 
?>

输出

Array ( [PHPSESSID] => h5onbf7pctbr0t68adugdp2611 [user_name] => Guru99 )

注意:$_COOKIE 是 PHP 内置的超全局变量。

它包含所有已设置 Cookie 的名称和值。

$_COOKIE 数组可以包含的值的数量取决于在 php.ini 中设置的内存大小。

默认值为 1GB。

默认值为 1GB。

测试我们的应用程序。

假设您已将 PHP 文件保存在 phptus 文件夹中。

  • 步骤 1 – 打开您的 Web 浏览器并在地址栏输入 https:///phptuts/cookies_read.php

Retrieving the Cookie value

注意:只显示了一个空数组。

  • 步骤 2 – 浏览到地址 https:///phptuts/cookies.php

Retrieving the Cookie value

  • 步骤 3 – 切换回第一个标签页,然后点击刷新按钮。

Retrieving the Cookie value

等待一分钟,然后再次点击刷新按钮。您得到了什么结果?

删除 Cookie

  • 如果您想在 Cookie 到期时间之前销毁它,那么您需要将到期时间设置为已经过去的时间。
  • 创建名为 cookie_destroy.php 的新文件,其中包含以下代码。
<?php

 setcookie("user_name", "Guru99", time() - 360,'/');

?>
  • 重复上面检索 Cookie 值部分中的步骤 1 到 3。
  • 打开地址 https:///phptuts/cookie_destroy.php
  • 切换到地址 https:///phptuts/cookies_read.php 它显示了什么结果?

什么是 Session?

  • Session 是存储在服务器上的全局变量。
  • 每个 Session 都被分配一个唯一的 ID,用于检索存储的值。
  • 每当创建一个 Session 时,一个包含唯一 Session ID 的 Cookie 就会存储在用户的计算机上,并在每次向服务器发送请求时返回。如果客户端浏览器不支持 Cookie,则唯一的 PHP Session ID 将显示在 URL 中。
  • 与 Cookie 相比,Session 可以存储相对较大的数据。
  • Session 的值会在浏览器关闭时自动删除。如果您想永久存储这些值,那么您应该将它们存储在数据库中。
  • 与 $_COOKIE 数组变量一样,Session 变量存储在 $_SESSION 数组变量中。与 Cookie 一样,Session 必须在任何 HTML 标签之前启动。

为什么要以及何时使用 Session?

  • 您想更安全地将用户信息(例如用户 ID)存储在服务器上,以免恶意用户篡改。
  • 您想在页面之间传递值。
  • 您想要不兼容 Cookie 的浏览器上的 Cookie 替代方案。
  • 您想以比在 URL 中传递更有效、更安全的方式存储全局变量。
  • 您正在开发一个像购物车这样的应用程序,该应用程序需要临时存储容量大于 4KB 的信息。

创建 Session

为了创建 Session,您必须首先调用 PHP session_start 函数,然后将您的值存储在 $_SESSION 数组变量中。

假设我们想知道一个页面加载了多少次,我们可以使用 Session 来实现。

下面的代码演示了如何创建和检索 Session 中的值。

<?php

session_start(); //start the PHP_session function 

if(isset($_SESSION['page_count']))
{
     $_SESSION['page_count'] += 1;
}
else
{
     $_SESSION['page_count'] = 1;
}
 echo 'You are visitor number ' . $_SESSION['page_count'];

?>

输出

You are visitor number 1

销毁 Session 变量

session_destroy() 函数用于销毁所有 PHP Session 变量。

如果您只想销毁单个 Session 项目,请使用 unset() 函数。

下面的代码说明了如何使用这两种方法。

<?php

 session_destroy(); //destroy entire session 

?>
<?php

unset($_SESSION['product']); //destroy product session item 

?>

Session_destroy 会删除所有 Session 数据,包括与 Session 关联的 Cookie。

Unset 只会释放单个 Session 变量。

其他数据保持不变。

摘要

  • Cookie 是保存在用户计算机上的小型文件。
  • Cookie 只能从发布的域读取。
  • Cookie 可以设置到期时间,如果未设置,则 Cookie 在浏览器关闭时过期。
  • Session 就像存储在服务器上的全局变量。
  • 每个 Session 都会获得一个唯一的标识 ID,用于跟踪用户的变量。
  • Cookie 和 Session 都必须在向浏览器发送任何 HTML 标签之前启动。