【PHP基础知识】——Cookie知识详解与使用

一、概念

Cookie是在HTTP协议下,用于服务器或脚本来维护客户网站上信息的一种方式。Cookie是由Web服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web站点都可以访问Cookie信息。
Cookie的作用,通俗地说就是当一个用户通过HTTP协议访问一个服务器的时候,这个服务器会将一些Key/Value键值对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户下次访问这个服务器的时候,数据又被完整地带回给服务器。



二、工作原理

Cookie是保存在客户端的纯文本格式,不包含任何可执行的代码。其工作过程大致如下:
1、一个Web页面或服务器告知浏览器按照一定规范来储存这些信息;
2、浏览器就会在每次访问这些网站时在客户端保存cookie文件;
3、浏览器会在随后的请求中将这些信息发送至服务器;
4、Web服务器就可以使用这些信息来识别不同的用户;
大多数需要登录的网站在用户验证成功之后都会设置一个cookie,只要这个cookie存在并有效,用户就可以*浏览这个网站的任意页面。

【PHP基础知识】——Cookie知识详解与使用
(图片来自http://blog.csdn.net/happyguys12345/article/details/74910595)

三、Cookie的属性

创建cookie:Set-Cookie:name=value;
紧跟cookie值后面的每个选项都以分号和空格分开,每个选择都指定了cookie在什么情况下应该被发送至服务器,包含以下属性:
1、Domain:域名,表示当前cookie所属于哪个域或子域下面,默认情况下,domain会被设置为创建该cookie的页面所在的域名,所以当给相同域名发送请求时该cookie会被发送至服务器。
2、Path:表示cookie的所属路径。该选项指定了请求的资源URL中必须存在指定的路径时,才会发送Cookie消息头。需要注意的是,只有在domain选项核实完毕之后才会对path属性进行比较。path属性的默认值是发送Set-Cookie消息头所对应的URL中的path部分。
3、secure:表示该cookie只能用https传输。一般用于包含认证信息的cookie,要求传输此cookie的时候,必须用https传输。
4、Expires/Max-age:设置过期时间,格式:Wdy, DD-Mon-YYYY HH:MM:SS GMT
没有设置expires选项时,cookie的生命周期仅限于当前会话中,关闭浏览器意味着这次会话的结束。
5、httponly:表示此cookie必须用于http或https传输。这意味着,浏览器脚本,比如javascript中,是不允许访问操作此cookie的。



四、Cookie删除规则

cookie会被浏览器自动删除,通常存在以下几种原因:
1、会话cooke(Sessioncookie)在会话结束时(浏览器关闭)会被删除
2、持久化cookie在到达失效日期时会被删除
3、如果浏览器中的cookie数量达到限制,那么cookie会被删除以为新建的cookie创建空间。



五、Cookie的缺陷

1、Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
2、由于在HTTP请求中的cookie是明文传递的,所以安全性成问题。(除非用HTTPS)
3、Cookie的大小限制在4KB左右。对于复杂的存储需求来说是不够用的。



六、PHP中使用Cookie

在PHP中通常使用$_COOKIE数组来取得cookie的值,具体地,浏览器发送请求的时候会把cookie包含在请求头里,然后服务器端解析这个cookie头,并存到$_COOKIE变量里。
1、PHP创建Cookie的方法:

bool setcookie(string$name [,string$value="" [,int$expire=0 [,string$path="" [,string$domain="" [,bool$secure=false [,bool$httponly=false]]]]]])

【PHP基础知识】——Cookie知识详解与使用

setcookie()函数向客户端发送一个HTTP cookie,即创建一个cookie。

注:必须在任何其他输出发送前对cookie进行赋值。如果成功,则该函数返回true,否则返回false。

如果不设置过期时间,则默认为浏览器结束后过期,这称为会话cookie。


2、PHP中修改cookie值:同样采用setcookie()函数,但是不能立即生效,需要刷新浏览器;

3、PHP中删除cookie:
setcookie($cookieName,value,time()-秒数);
//或者
setcookie($cookiename, '');
//或者
setcookie($cookiename, NULL);
同样不能立即生效,需要刷新浏览器。


4、使用PHP代码两次赋值使Cookie的修改及时生效
$_COOKIE[$name] = $value;  
setcookie($name, $value, $time, $path, $domain, 0);  

原理:原本setcookie之后刷新了浏览器响应才会将新的cookie值写入$_COOKIE这个全局变量,这里只是手动添加到了这个全局变量罢了。

七、Cookie注意事项

1、setcookie()之前不能有任何html输出,就是空格,空白行都不行,必须在html文件的内容输出前设置。这里可以采用我之前文章讲解过的输出缓冲来避免;
2、setcookie()后,你在当前页调用echo$_COOKIE[“name”]不会有输出。必须刷新或到下一个页面才可以看到cookie值(除非采用上述的两次赋值);
3、不同浏览器对cookie处理不同。客户端可以禁用cookie,浏览器也会限制cookie的数量。一个浏览器能创建的cookie的每个大小不能超过4KB,每个WEB站点能设置的cookie总数不能超过20个;
4、cookie是保存在客户端的,用户禁用了cookie,cookie也会失去作用。