Cookie是一种由服务器发送给客户端的片段信息,存储在客户端浏览器的内存或者硬盘上,在客户端对服务器的请求中发回它。PHP透明地支持HTTP Cookie。可以利用他在远程浏览器端存储数据并以此来跟踪和识别用户的机制。
Cookie是用来将使用者资料记录在客户端的技术,这种技术让Web服务器能将一些只需存放于客户端,或者可以在客户端进行运算的资料,存放于用户的计算机系统中。就不需要在连接服务器时,再通过网络传输、处理这些资料,进而提高网页处理的效率,降低服务器的负担。
向客户端计算机中设置Cookie
Cookie的建立十分简单,只要用户的浏览器支持Cookie功能,就可以使用PHP内建的setcookie()函数来新建立一个Cookie。Cookie是HTTP标头的一部分,因此setcookie()函数必须在其他信息被输出到浏览器前调用,所以即使是空格或空行,都不要在调用setcookie()函数之前输出,这和调用header()函数的限制类似。
bool setcookie(string $name [,string $value [,int $expire [,string $path [,string $domain [,bool $secure]]]]])
setcookie()函数定义一个和其余的HTTP标头一起发送的Cookie,它的所有参数是对应HTTP标头Cookie资料的属性。
参数 | 描述 | 示例 |
$name | Cookie的识别名称 | 使用$_COOKIE['cookiename']调用名为cookiename的Cookie |
$value |
Cookie的值,可以为数值或者字符串形态,此值保存在客户端,不要用来保存敏感数据 |
假定第一个参数为“cookiename”,可以通过$_COOKIE['cookiename']获取其值 |
$expire |
Cookie的生存期限,这个是UNIX时间戳,即从UNIX纪元开始的秒数 |
如time()+60*60*24*7将设定Cookie在一周后失效,如果未设定Cookie,则会在会话结束后就立即失效 |
$path |
Cookie在服务器的指定路径,当设定此值时,服务器中只有指定路径下的网页或程序可以存取此Cookie |
如果该参数设为“/”,Cookie在整个domain内有效,如果设为“/foo/”,Cookie就只在domain下的/foo/目录及其及目录内有效,默认值为设定Cookie的当前目录 |
$domain |
指定此Cookie所属服务器的网址名称,预设是建立此Cookie服务器的网址 |
要使Cookie能在example.com域名下的所有子域名都有效的话,该参数应该设为“.example.com”。虽然“.”并不是必须的,但加上他会兼容更多的浏览器。如果该参数设为www.example.com的话,就只有www子域内有效 |
$secure |
指明Cookie是否仅通过安全的HTTPS连接传送,Cookie中的安全识别常数,如果设定瓷质代表只有在某些情况下,才能在客户端与服务器之间传递 |
当设为TRUE时,Cookie仅在安全的连接中被设置,默认为FALSE |
如果只有$name这一个参数,则原有此名称的Cookie选项将会被删除,你也可以使用空字符串(“ ”)来略过此参数。参数$expire和$secure是个整数,你可以使用0来略过此参数,而不是使用空字符串。但参数$expire是一个正规的UNIX时间整数。有time()或mktime()函数传回。参数$secure指出此Cookie将只有在安全HTTPS连接时传送。在实际建立Cookie是通常仅使用前三项参数。
setcookie("username","skygao",time() + 60*60*24*7); //向客户端发送一个Cookie,将变量username值为skygao,保存客户端一周的时间
如果访问改脚本就会设置Cookie,并将用户名添加到访问者电脑的Cookie中去。上例表示建立一个识别名称位“username”的Cookie,其内容为字符串“skygao”,而在客户端有效的存储期限则指定为一周。
setcookie("username","skygao",time() + 60*60*24*7,'/test/','.example.com',1);
在上例中,参数“/test/”表示Cookie只有在服务器的这个目录或子目录中有效。参数“.example.com”是Cookie能在如example.com域名下的所有子域名都有效,虽然“.”并不必需的,但加上它会兼容更多的浏览器。当最后一个参数设置为1时,则Cookie仅在安全的连接中才能被设置。如果需要向客户端设置多个Cookie,可以通过调用多次setcookie()函数实现。但如果两次设置相同的Cookie识别名称,则后设置的Cookie会把值赋给与自己同名的Cookie变量,如果原来的值不为空,则会被覆盖。
在PHP脚本中读取Cookie的资料内容
如果Cookie设置成功,客户端就拥有了Cookie文件,用来保存Web服务器为其设置的用户信息。Cookie是一个以普通文本形式记录信息的,虽然直接使用文本编辑器就可以打开浏览,但直接去阅读Cookie文件中的信息没有意义。而是当客户再次访问该网站时,浏览器会自动把与该站点对应的Cookie信息全部发回给服务器。自PHP5以后,任何从客户端发送过来的Cookie信息,都会被自动保存在$_COOKIE全局数组中,所以在每个PHP脚本中都可以从该数组中读取对应的Cookie信息。
在设置Cookie的脚本中,第一次读取它的信息并不会生效,必须刷新或者到下一个页面才可以看到Cookie值。因为Cookie要先被设置到客户端,再次访问时才能被发送回来,这是才能被获取。
数组形态的Cookie应用
Cookie也可以利用多维数组的形式,将多个内容值存储在相同Cookie名称标识符下。但不能直接使用setcookie()函数,将数组变量插入到第二个参数作为Cookie的值,因为setcookie()函数的第二个参数必须传入一个字符串的值。如果需要将数组变量设置到Cookie中,可以在setcookie()函数的第一个参数中,通过在Cookie标识名称指定数组下标的形式设置。
setcookie("user[username]","skygao"); setcookie("user[password]",md5('123456')); setcookie("user[email]",'skygao@example.com');
在上面一段程序中,建立了一个标识名称为“user”的Cookie,但其中包含了三个数据,这样就形成了Cookie的关联数组形态。设置成功后,如果需要在PHP脚本中获取其值,同样是使用$_COOKIE超级全局数组。但这时的$_COOKIE数组并不是唯一的了,而是变成了一个二维数组,一维的下标变量是“user”。
foreach($_COOKIE['user'] as $key=>$value){ echo $key.":".$value." "; }
删除Cookie
如果需要删除保存在客户端的Cookie,可以使用两种方法。而这两种方法和设置Cookie一样,也是调用setcookie()函数实现删除的动作:第一种方式,省略setcookie()函数的所有参数列,仅导入飞一个参数Cookie识别名称参数,来删除指定名称的Cookie资料;第二种方式,利用setcookie()函数把目标Cookie设定为“已过期”状态。
setcookie('account'); //只指定Cookie识别名称一个参数,即删除客户端中这个指定名称的Cookie资料 setcookie('isLogin',"",time() - 100); //设置Cookie在当前时间之前已经过期,因此系统会自动删除识别名称为isLogin的Cookie
第一种方法将Cookie的生存时间默认设置为空,则生存期限与浏览器一样,浏览器关闭时Cookie就会被删除。而对于第二种删除Cookie的方法,Cookie的有效期限参数的含义指当超过设定时间时,系统会自动删除客户端的Cookie。