咱们知道,session是在服务器端保持用户会话数据的一种方法,对应的cookie是在客户端保持用户数据。HTTP协议是一种无状态协 议,服务器响应完以后就失去了与浏览器的联系,最先,Netscape将cookie引入浏览器,使得数据能够客户端跨页面交换,那么服务器是如何记住众 多用户的会话数据呢?php
首先要将客户端和服务器端创建一一联系,每一个客户端都得有一个惟一标识,这样服务器才能识别出来。建议惟一标识的方法有两种:cookie 或者经过GET方式指定。默认配置的PHP使用session的时会创建一个名叫”PHPSESSID”的cookie(能够经过php.ini修改 session.name值指定),若是客户端禁用cookie,你也能够指定经过GET方式把session id传到服务器(修改php.ini中session.use_trans_sid等参数)。前端
咱们查看服务器端session.save_path目录会发现不少相似sess_vv9lpgf0nmkurgvkba1vbvj915这 样的文件,这个其实就是session id “vv9lpgf0nmkurgvkba1vbvj915″对应的数据。真相就在这里,客户端将session id传递到服务器,服务器根据session id找到对应的文件,读取的时候对文件内容进行反序列化就获得session的值,保存的时候先序列化再写入。sql
事实就是这样,因此若是服务器不支持session或者你想自定义session,彻底能够DIY,经过PHP的uniqid生成永不重复 的session id,而后找个地方存储session的内容便可,你也能够学flickr把session存储在MySQL数据库中。数据库
了解的原理以后,所谓的session其实就是客户端一个session id服务器端一个session file,新建session以前执行session_start()是告诉服务器要种一个cookie以及准备好session文件,要否则你的 session内容怎么存;读取session以前执行session_start()是告诉服务器,赶忙根据session id把session文件反序列化。浏览器
只有一个session函数能够在session_start()以前执行,session_name():读取或指定session名称(好比默认的就是”PHPSESSID”),这个固然要在session_start以前执行。服务器
session在大访问量网站上确实影响系统性能,影响性能的缘由之一由文件系统设计形成,在同一个目录下超过10000个文件时,文件的 定位将很是耗时,PHP支持session目录hash,咱们能够经过修改php.ini中session.save_path = “2;/path/to/session/dir”,那么session将存储在两级子目录中,每一个目录有16个子目录[0~f],不过好像PHP session不支持建立目录,你须要事先把那么些目录建立好 。cookie
还有一个问题就是小文件的效率问题,通常咱们的session数据都不会太大(1~2K),若是有大量这样1~2K的文件在磁盘上,IO效 率确定会不好,PHP手册上建议使用Reiserfs文件系统,不过Reiserfs的前景堪忧,Reiserfs的做者把媳妇给杀了,SuSE也抛弃了 Reiserfs。session
其实还有不少中存储session的方式,能够经过php -i|grep “Registered save handlers”查看,好比Registered save handlers => files user sqlite eaccelerator能够经过文件、用户、sqlite、eaccelerator来存,若是服务器装了memcached,还有会mmcache的 选项。固然还有不少,好比MySQL、PostgreSQL等等。都是不错的选择。负载均衡
咱们前端可能有不少台服务器,用户在A服务器上登陆了,种下了session信息,而后访问网站的某些页面没准跳到B服务器上去了,若是这个时候B服务器上没有session信息又没有作特殊处理,可能就会出问题了。运维
session同步有不少种,若是你是存储在memcached或者MySQL中,那就很容易了,指定到一样的位置便可,若是是文件形式的,你能够用NFS统一存储。
还有一种方式是经过加密的cookie来实现,用户在A服务器上登陆成功,在用户的浏览器上种上一个加密的cookie,当用户访问B服务 器时,检查有无session,若是有固然没问题,若是没有,就去检验cookie是否有效,cookie有效的话就在B服务器上重建session。这 种方法其实颇有用,若是网站有不少个子频道,服务器也不在一个机房,session没办法同步又想作统一登陆那就太有用了。
固然还有一种方法就是在负载均衡那一层保持会话,把访问者绑定在某个服务器上,他的全部访问都在那个服务器上就不须要session同步了, 这些都是运维层面的东西。就说这么多吧,根据本身的应用来选择使用session,不要由于你们都说session影响系统性能就畏首畏尾,知道问题,解 决问题才是关键,惹不起躲得起不适合这里。
转自:http://www.nowamagic.net/librarys/veda/detail/358