PHP 会话和 PHP Cookies 示例
什么是 Cookie?
Cookie 是 Web 服务器存储在客户端计算机上的一个最大大小为 4KB 的小文件。
一旦设置了 cookie,随后的所有页面请求都会返回 cookie 名称和值。
Cookie 只能从发出它的域中读取。例如,使用域设置的 Cookie www.guru99.com 无法从域中读取 职业生涯.guru99.com.
互联网上的大多数网站都会显示来自其他域的元素,例如广告。提供这些元素的域也可以设置自己的 cookie。这些被称为第三方 cookie。
用户创建的 Cookie 只有用户自己可见,其他用户无法看到其值。
大多数网络浏览器都有禁用 cookies、第三方 cookies 或两者的选项。
如果是这种情况,那么 PHP 会通过在 URL 中传递 cookie 令牌来进行响应。
下图说明了 cookie 的工作原理。
在这里,
1)用户请求存储 Cookie 的页面
2)服务器在用户计算机上设置 cookie
3)用户的其他页面请求将返回Cookie名称和值
为何以及何时使用 Cookies?
- Http 是一种无状态协议;Cookie 允许我们使用存储在用户计算机上的小文件来跟踪应用程序的状态。Cookie 的存储路径取决于浏览器。Internet Explorer 通常将它们存储在 Temporal Internet Files 文件夹中。
- 个性化用户体验——这是通过允许用户选择他们的偏好来实现的。接下来请求的页面是根据 cookie 中设置的偏好进行个性化的。
- 跟踪用户访问的页面
创建 Cookie
现在让我们看一下创建 Cookie 的基本语法。
<?php setcookie(cookie_name, cookie_value, [expiry_time], [cookie_path], [domain], [secure], [httponly]); ?>
这里,
- php“setcookie”是 PHP功能 用于创建 cookie。
- “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,用于判断cookie是否通过https发送,如果为true则为http发送。
- “[Httponly]” 是可选的。如果设置为 true,则只有客户端脚本语言,即 JavaScript 无法访问它们。
请注意: php 设置 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。
测试我们的应用程序。
假设您已将 PHP 文件保存在 phptus 文件夹中。
- 步骤 1 – 打开 Web 浏览器并输入 URL http://localhost/phptuts/cookies_read.php
注意:仅显示了一个空数组
- 步骤 2 – 浏览至 URL http://localhost/phptuts/cookies.php
- 步骤 3 – 切换回第一个选项卡,然后单击刷新按钮
等待一分钟,然后再次点击刷新按钮。你得到了什么结果?
删除cookies
- 如果您想在 cookie 过期之前销毁它,那么您可以将过期时间设置为已经过去的时间。
- 创建一个名为 cookie_destroy.php 的新文件,代码如下
<?php setcookie("user_name", "Guru99", time() - 360,'/'); ?>
- 重复上面检索 cookie 值部分中的步骤 1 到 3。
- 打开网址 http://localhost/phptuts/cookie_destroy.php
- 切换到 URL http://localhost/phptuts/cookies_read.php 它显示什么结果?
什么是会话?
- 会话是存储在服务器上的全局变量。
- 每个会话都分配有一个唯一的 ID,用于检索存储的值。
- 每当创建会话时,包含唯一会话 ID 的 Cookie 都会存储在用户计算机上,并随每个对服务器的请求一起返回。如果客户端浏览器不支持 Cookie,则 URL 中将显示唯一的 PHP 会话 ID
- 与 Cookie 相比,会话能够存储相对较大的数据。
- 会话值会在浏览器关闭时自动删除。如果要永久保存这些值,则应将其存储在数据库中。
- 和 $_COOKIE 数组变量一样,会话变量也存储在 $_SESSION 数组变量中。和 cookies 一样,会话必须在任何 HTML 标记之前启动。
为什么以及何时使用 Sessions?
- 您希望将用户 ID 等重要信息更安全地存储在服务器上,以防止恶意用户篡改。
- 您想将值从一个页面传递到另一个页面。
- 您希望在那些不支持 Cookie 的浏览器上使用 Cookie 的替代方案。
- 与在 URL 中传递全局变量相比,您希望以更高效、更安全的方式存储全局变量
- 您正在开发一个应用程序(例如购物车),该应用程序必须临时存储容量大于 4KB 的信息。
创建会话
为了创建会话,您必须首先调用 PHP session_start 函数,然后将您的值存储在 $_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_destroy() 函数用于销毁整个 Php 会话变量。
如果您只想销毁会话单个项目,请使用 unset() 函数。
下面的代码说明了如何使用这两种方法。
<?php session_destroy(); //destroy entire session ?>
<?php unset($_SESSION['product']); //destroy product session item ?>
Session_destroy 删除所有会话数据,包括与会话相关的 cookie。
取消设置仅释放单个会话变量。
其它数据保持不变。
总结
- Cookie 是保存在用户计算机上的小文件
- 只能从发布域读取 Cookie
- Cookies 可以有一个有效期,如果没有设置,那么当浏览器关闭时,cookie 就会过期
- 会话就像存储在服务器上的全局变量
- 每个会话都被赋予一个唯一的标识 id,用于跟踪用户的变量。
- 在将任何 HTML 标签发送到浏览器之前,必须启动 cookie 和会话。