简介
要了解cookie, 先要从HTTP协议说起. 所谓协议, 就要有发起协议的人, 遵守协议的人, 具体来说, 一般就是服务端和客户端, 双方遵照HTTP协议的内容.
HTTP协议有以下特点:
1, 支持客户/服务器模式;
2, 简单快速: 无论是客户端请求还是服务端响应,设置好对应的消息头,方法,消息体,就能够传达给对方,并且双都能理解对方的意思。
3, 灵活: HTTP允许传输任意类型的数据对象。传输的类型由Content-Type加以标记即可。
4, 无连接: 客户端请求服务端,服务端响应完成之后就自动断开连接本次链接。
5, 无状态: 客户端请求服务端,服务端响应完成之后不会记录任何本次连接通信的数据。
当然,HTTP协议远远不止这么多,具体的我们后期再说,有了上面的HTTP协议的知识,我们就要引出我们的cookie了。
上面提到,由于HTTP的无状态特点, 服务端响应完客户端的请求之后, 不记录任何本次连接的通信数据, 这样就造成一个问题, 就是服务端"记不住"客户端的请求, 产生"你是谁"的问题. 就好比大楼里的保安大叔, 每个进入大楼的人都要登记身份, 而且这位保安大叔还记不住人, 导致每个人每次进入大楼都要做一次身份校验, 这样就很费时间,耗费人力了.
那怎么解决这个问题呢? 这里就用到了cookie. 就是服务端在响应完客户端请求的时候, 在返回数据的时候, 给客户端一段数据, 下次客户端请求的时候, 带上这段数据, 这样服务端就知道是"哪个"客户端在请求了. 就好比保安大叔给了你一个小纸条, 上面写着每个人的编号, 下次进入大楼, 只要把小纸条给保安大叔看一下, 他认识上面的字, 就知道你之前来过, 确认了你的身份, 就直接放行了, 免除了再次登记和校验的过程.
OK, 这样一圈下来, 我们知道, cookie就是服务端返回给客户端的一小段数据, 这段数据记录这本次请求的一些信息, 最主要的, 就是一些身份信息. 这样在下次请求的时候带上, 服务端就知道你上一次请求的状态和相关信息, 让请求有了状态, 有了记忆.
很多人在存储一些数据的时候不推荐使用cookie,原因在于每次客户端请求服务端的时候,都会带上cookie信息,cookie虽然通常一个value值只有4K大小,但是量一旦上来就会很费带宽。
基本工作原理
cookie主要是通过报头HTTPHeader来传递数据。也就是在请求头和消息头里面传递数据。Cookie机制定义了两种报头:Set-Cookie报头和Cookie报头。set-cookie存在于服务器响应的消息头中。而cookie则存在于客户端请求的消息头中。
cookie的运行流程如下:

1, 客户端在浏览器的地址栏中键入Web服务器的URL,浏览器发送读取网页的请求。
2, 服务器接收到请求后,产生一个Set-Cookie报头,放在HTTP报文中一起回传客户端,发起一次会话。
3, 客户端收到应答后,若要继续该次会话,则将Set-Cook-ie中的内容取出,形成一个Cookie.txt文件储存在客户端计算机里。
4, 当客户端再次向服务器发出请求时,浏览器先在电脑里寻找对应该网站的Cookie.txt文件。如果找到,则根据此Cookie.txt产生Cookie报头,放在HTTP请求报文中发给服务器。
5, 服务器接收到包含Cookie报头的请求,检索其Cookie中与用户有关的信息,生成一个客户端所请示的页面应答传递给客户端。 浏览器的每一次网页请求,都可以传递已存在的Cookie文件,例如,浏览器的打开或刷新网页操作。
在php中设置cookie有两种方式:
1, setCookie函数的调用
2, session_start函数的调用
这里稍微解释下session_start做的工作,session_start()一旦写上,服务器端就会在服务器上生成一个session_id,并同时向客户端发送set-cookie报头,内容为phpsessid=session_id, 客户端接到响应就会生成cookie文件,也就是session_start里面其实包含了setCookie的操作,只是没有setCookie那么灵活而已。