cookie与session

其实之前对于cookie和session只是有个大概的理解,cookie存在客户端,session存在服务器端,知道的比较笼统,最近专门查资料学习了下,并且自己也敲代码测试了下

HTTP

http协议是无状态,无连接的,http协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求客户和服务器都要新建一个tcp socket连接连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。

http 1.0中默认是关闭的,需要在http头加入"Connection: Keep-Alive",才能启用Keep-Alive;http 1.1中默认启用Keep-Alive,如果加入"Connection: close ",才关闭。目前大部分浏览器都是用http1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep-Alive连接就看服务器设置情况。

可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。
但是,keep-alive并不是免费的午餐,长时间的tcp连接容易导致系统资源无效占用。配置不当的keep-alive,有时比重复利用连接带来的损失还更大。所以,正确地设置keep-alive timeout时间非常重要。

  • keepalvie timeout
    Httpd守护进程,一般都提供了keep-alive timeout时间设置参数。比如nginx的keepalive_timeout,和Apache的KeepAliveTimeout。这个keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要hold住keepalive_timeout秒后,才开始关闭这个连接。
    当httpd守护进程发送完一个响应后,理应马上主动关闭相应的tcp连接,设置 keepalive_timeout后,httpd守护进程会想说:”再等等吧,看看浏览器还有没有请求过来”,这一等,便是keepalive_timeout时间。如果守护进程在这个等待的时间里,一直没有收到浏览发过来http请求,则关闭这个http连接。

cookie是保存在客户端,php中用setcookie函数来对cookie进行操作,可以分为内存cookie和硬盘cookie.

setcookie('name', 'xiaoming');

上段代码在浏览器中设置了一个键名为name,值为xiaoming的内存cookie,如果我此时关闭浏览器,次cookie就消失了,所以为内存cookie

setcookie('name', 'xiaoming', time() + 3600);

此段代码设置了有效期为一小时的cookie的变量,关闭浏览器再打开此cookie还在,所以是硬盘cookie.
setcookie的第四个参数是此cookie的服务器作用的位置,一般来说不设置此参数,则默认是在这个文件所属的文件夹下.例如 我在hosts文件配置了一个127.0.0.1 localhost
在服务器apache或者nginx将localhost 指向/work目录,那么如果我在work目录下建了一个php文件并设置了一个cookie变量,则这个cookie变量默认的path 就是'/'.
path为cookie的路径,浏览器在发送cookie是只会发送对应路径及祖先级路径的cookie,如cookieA设置在根下,cookieB设置在/dir/下,访问dir的请求会带着cookieB和cookieA,但访问根路径的请求只会带着cookieA

domain参数为cookie的域名,只能设置为当前域或当前域的上级域。例如,一个在a.b.com的页面,可以设置domain为a.b.com,b.com,设置为a.b.com只能在a.b.com中访问cookie,若直接设置为b.com,则可以在其他b.com域下访问

secure参数为true会对cookie进行HTTPS加密传输

httponly为true时,只能通过请求发送cookie,使用javascript无法读取httponly的cookie,安全性更高

** 缺点**
cookie不安全,劫取cookie后可以用来cookie欺骗
不要把cookie当作客户端存储器来使用,每个域名允许的cookie是有限制的,不同的浏览器限制也不同,cookie中保存的最大字节数是4K.
cookie设置后每次都会附着在http的头一起发送,浪费带宽.

SESSION

客户端第一次访问,服务器端session初始化,创建session_id,执行php代码,若产生session数据,则存放在$_SESSION全局数组中,页面执行完毕,将session信息存放在文件中,或者数据库缓存中,同时将带有session_id的响应发送给客户端,session_id等必要信息存放在cookie中.
客户端第二次访问,服务器接收到请求,根据请求头中的session_id读取session文件,将数据拿出来,没有的话则和第一次一样,开始一个新的会话.
点击退出的话,销毁session,删除session数据,销毁会话文件.

session_name();  //获取session name
session_id();  //获取session_id

如果网站有千万级用户,那么会在服务器生成千万个文件,每次从千万个文件找一个,性能不好,可以将session存放在redis中

原文地址:https://www.cnblogs.com/binxyz/p/7759795.html