session与cookie的关系讲解_第1页
session与cookie的关系讲解_第2页
session与cookie的关系讲解_第3页
session与cookie的关系讲解_第4页
session与cookie的关系讲解_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、session与cookie禁止浏览器cookie情况下,session能正常工作吗?禁用浏览器cookie后,session还能正常工作吗?为什么禁止cookie后session无法正常工作?请求header响应header浏览器发送的cookie数据firefox下用firebug跟踪cookieIE下用httpwatch跟踪cookieIE下用httpwatch跟踪cookieIE发送的cookie清空cookie,模拟第一次访问网站服务器发送给浏览器的cookie信息关系默认情况下,服务器使用响应header的set-cookie指令发送session_id给浏览器(实质上就是一个特殊

2、的cookie)浏览器在后续对这个站点(域名一样)访问时,将使用请求heade的Cookie指令将sessiion_id发送给服务器(和本质的cookie机制完全一样)根本原理是:使用cookie来传送session_id, 如果cookie被禁止,session_id无法传递,当然session就不能正常工作?知道了这个原理后,在不使用session_start()调用时,如何自行实现session ?见范例服务器处理session的流程YYNNsession和cookie保存在哪里?默认情况下,session保存在:ASP : 服务器共享内存中(ASPSESSION)PHP : 文件系统

3、PHPSESSIDJSP : 内存中 JSESSIONcookie保存在客户端的: 文件系统中IE可能为 C:Documents and SettingsAdministratorCookiesFirefox可能为 C:Documents and SettingsAdministratorApplication DataMozillaFirefoxProfilesx8o3fqac.defaulcookies.sqlite默认情况下,是通过cookie传送session_id的.当然,也可以通过url传递session_id(浏览器不支持cookie的情况下), 但这很不常见本文略过内存中没有设

4、置过期时间的cookie,均保存在浏览器内存中,当浏览器关闭时,这些cookie就自动清理,表现的形式就是session失效对php来说,当开启session时,服务器不得不尝试从session文件中读取session数据,并还原至$_SESSION数组中在页面执行完毕时,将session数据写回session文件中.显然,如果是高流量的网站,那么将会生成成千上万个session文件, 可以假设如果瞬间有1千个用户访问网站,那么将导致瞬间产生1千个读文件与写文件的操作这就是所谓的磁盘IO压力(input/output)任何高速的磁盘,在瞬间写入上千个小文件,并不是一件容易的事更何况这些文件小而

5、多,极易造成磁盘碎片,最终降低磁盘性能,从而严重影响整台服务器的性能!但是对ASP, JSP的session储存机制(内存中保存数据),虽然没有磁盘IO的压力,但是需要消耗大量内存内存空间分配,一般是按页为单位(4k,4096字节)而不是按字节分配,12字节的session数据,实际上可能会占用4K的内存空间(有些像磁盘的簇的概念)如window NTFS文件系统默认簇大小为4k,任何小于4K的文件不得不占用4K磁盘空间,4.1K的文件需要占用两个簇,实际上会浪费3.9K空间session的失效何种情况下session失效?客户端的原因1.未传回session_id,细分之:1.1.sessi

6、on cookie已经过期 1.2. 客户端cookie文件被删除(如手工清理IE的cookie) 1.3. 第一次访问网站(还没有cookie)服务器端原因服务器重启,session文件或session共享内存被清理可见,上述任意一条满足,session将过期session过期后,服务器上的session数据将会被删除?非也数据还在,只是没有客户端能访问到它而已小结从原理上分析后可知:session是会对服务器性能产生影响可大胆使用php默认的session存储方式(文件系统):1. 网站用户量很小(如一些基于WEB的OA, 网站的后台, 内部管理系统,日独立IP在1000之内)2. 不使用

7、多服务器负载的web站点上面两条,本质上都是小型web站点的特点, 但是针对其它情况,默认的session存储机制并不适用,需要改造之如果web站点规模较大,须使用多台服务器负载站点,就需要特殊处理,方可承担较重的session访问压力典型的负载均衡示意图所有有后端web服务器上部署着完全一样的程序,因为负载均衡器只转发请求,并不处理请求,故负载均衡器不容易出现问题(但要注意其并发连接数上限)对用户而言,在连续对站点的访问中,后端服务器均可能被访问到负载均衡的基本原理本文这里的负载均衡,仅针对提供http服务的服务器,不涉及数据库均衡,图片服务器等等负载均衡主要涉及到两种服务器:1. 负载均衡

8、器(反向代理服务器)2. 后端处理器(后端的web server)想象银行的营业厅1.只有一个排队机,但有多个业务窗口2.根据排队号把用户的业务办理请求分发到至指定窗口中去对web架构而言,与上述形式是类似的,负载均衡器相当于排队机,后端的web服务器相当于办理窗口.针对中型规模站点,或许只需要一个负载均衡器,多个web server即可,但对较大规模的站点,需要多个负载均衡器(类似银行的营业网点)和更多的后端web server, 回顾一下主流脚本语言默认的session保存机制:ASP : web服务器所在内存PHP : 文件系统JSP : 同ASP那么如果网站用户量很大,并且是多服务器环

9、境,某个用户的连续访问,每个服务器都有可能被访问到,因为默认的session数据是无法供多服务器共享的,对用户就表现为session失效,这是很严重的问题如何解决?load balancer分发如果针对某个用户的连接访问(不同的访问均有完全相同的客户端参数,如客户端IP,浏览器类型,user-agent值),将其后续访问固定分发给某个后端服务器上,即可,如第一次访问站点,访问到后端服务器C, 负载均衡器记录当前访问者ip是并且访问了服务器C第二次访问时,负载均衡器发现用户上次访问了C服务器,那么直接将请求分发到C服务器上如此,用户的session数据就可维持(对特定的用户,访问的始终是固定的后

10、端服务器)目前nginx,lighttpd,linux LVS可支持这种方式的负载均衡等等,如此一来,能算是负载均衡吗?可见是负载不均衡的这种方案在现实中确实是存在的,需要借助系统架构人员的帮助.总结:1.如无必要,尽量少用session 2.如果滥用session, 程序的稳定性难以得到保证3.如果某人写的程序中,大量使用$_SESSION,则可认为其还是小菜鸟4.PHP中使用session_set_cookie_params设置session cookie参数, 使用session_set_save_handler来接管sessionsession存储接管可见,PHP默认的session存储机制在大型站点中存在的缺陷:1. 大量小文件存在,影响磁盘IO性能2. 多服务器之间共享数据变得困难3. 可能存在单点故障幸运的是,PHP提供了session存储接管,我们可

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论