一个session通过使用内存中的cookie来工作,这说明了为什么只在创建session的浏览器实例运行时session是有效的;一旦浏览器实例被终止,那么分配给它的内存就会被冲刷掉然后返回给系统,同时销毁进程中的session cookie。如果你想要更持久的cookies,那么你可以使用PHP内建的cookie函数将数据以cookie文件的形式写入到用户磁盘,然后当需要的时侯将该数据读回。
在你开始使用cookies之前,有一些事情你需要清楚:
1. 因为cookies被用于记录你在某特定域上活动的信息,所有它们只可以被创建它们的域来读取。
2.一个域无法设置超过20个的cookies而且每个cookie限于最大4 KB的大小。
3. 一个cookie通常处理六个属性,其中,只有第一个是强制性的。下面就是这六个属性:
o 名称: cookie的名称
o 值:cookie的值
o 过期时间:cookie过期的日期和时间
o 路径:cookie数据可以被访问的域的最顶层目录。
o 域:cookie有效的域
o 安全:一个指示cookie是否应该只通过安全的HTTP连接传输的布尔标志。
更多的关于cookies的信息可以从NetScape公司获得,该公司首先发明了cookies。访问http://www.netscape.com/newsref/std/cookie_spec.html可以获得NetScape cookie的规范。
因为cookies存储于用户的硬盘上,所以作为开发人员的你几乎无法控制它们,记住这一点是重要的。如果一个用户决定取消其浏览器对cookie的支持,那么你的cookies将只是不被保存。因此,请避免编写严重依赖cookies的代码;而且在cookie数据无法从客户端获取时做好后备计划。
不要管上述警告,让我们看看PHP中的一些简单的cookie处理代码。
偶遇老朋友
PHP提供了单一的用于cookie操作的函数:setcookie()。该函数允许你读写cookie文件,就像下面例子演示的一样:
为了理解这是如何工作的,请通过浏览器请求上述页面几次。第一次请求时,因为依然没有cookie被设置,所以第一条消息被显示。在所有后面的尝试中,因为cookie已经被设置了,所以客户端将被识别然后第二条消息被显示。请注意,即使你终止了浏览器实例,重启浏览器然后再次访问之前的页面,这个依然有用(一个不同于你之前看到的session例子中所做的明显差异)。<?php if (!isset($_COOKIE['visited'])) { // if a cookie does not exist // set it setcookie("visited", "1", mktime()+86400, "/") or die("Could not set cookie"); echo "This is your first visit here today."; } else { // if a cookie already exists echo "Nice to see you again, old friend!"; } ?>
setcookie()函数接受六个参数:cookie名称、cookie值、cookie有效期、cookie域、cookie有效路径以及指示其安全状态的布尔值。正如之前所注解的那样,只有名称和值是强制的,即使上述例子使用mktime()函数(它工作的方式类似于之前所描述的time()函数)指定cookie的顶层目录和有效期(1天),
Cookie值被自动地从客户端送到PHP,然后被转化为类似于$_SESSION的超全局数组的$_COOKIE变量中的关键字-值对。值可以使用标准的关联数组符号来取得,就像上述例子一样。请注意,和session一样,对setcookie()的调用必须发生在脚本产生任意输出之前,否则你会看到像下面这样的错误:
Warning: Cannot add header information - headers already sent by (output started at ... )