为什么要session共享 现在稍微大一点的网站基本上都有好几个子域名。如果这些网站需要共享用户登录信息,那么就需要session共享。当然前提是要有相同的主域名。 PHP的session原理 客户端访问php页面,执行session_start,生成session_id。一般我们把session_id保存在cookie上,session内容保存在服务器上。当客户端访问不同页面时,会通过session_id传给服务端,通过session_id获取session内容。 流程是这样的,但是不同的服务器会为同一个客户端生成不同的session_id,所以不同的服务器无法获取到相同的session内容。而且PHP默认的session数据是单独存放在服务器的文件系统中的。 因此,我们要解决session共享,必须解决两个问题: 1。解决多台服务器使用同一个session_id 比较简单,只要把存放session_id的cookie的域名设置在PHP域中就可以了。 打开PHP.ini,设置session.cookie_domain=.feiniu.com, 当然你也可以在php代码中设置ini_set("session.cookie_domain","feiniu.com")。 2。多个服务器使用相同的session_id访问相同的session内容 要实现这一点,session内容必须存储在所有服务器都可以访问的地方。PHPsession内容是默认存储一般的解决方案是将服务器中的文件存储在数据库中,memcache或者redis等缓存服务器,当然也可以使用默认的文件存储方式,使用NFS统一存储。 3。如何选择存储引擎 默认文件存储:这种方式的session销毁依赖于php垃圾回收器。在高并发或者销毁时间长的情况下,SESSION目录下会产生大量的文件。当然你可以设置分类目录来保存SESSION文件。这样会造成两个问题:一是查找文件速度慢;第二,每个目录下可以容纳的文件数量是有限的,可能会导致新建SESSION存储失败。 数据库存储: 将Session存储在数据库中可以防止Session数据被垃圾回收器删除,并且可以固化Session数据。但是使用数据库同步session会增加数据库的IO,增加数据库的负担。而且数据库读写速度慢,不利于session的及时同步。 memcache存储: 这种方式同步session不会增加数据库的负担,安全性比较高。将会话放在内存中比从文件中读取它们要快得多。而memcache将内存划分为各种规格的存储块,每个块都有一个大小。这种方式也决定了memcache无法充分利用内存,会出现内存碎片。如果存储块不足,就会发生内存溢出。对于那些不需要“分布式”,不需要共享,或者仅仅是小到只有一台服务器的应用,memcached不会带来任何好处,相反,它会拖慢系统效率,因为网络连接也需要资源。 redis存储: 与memcache相比,redis访问速度稍慢,但也有很多好处。Redis支持很多数据结构,可以存储数组或者对象,而memcache只能存储字符串。在session机器重启的情况下,memcache的所有用户都必须重新获得session,但redis不会。 当大量用户突然涌入,产生大量数据填满session机器的内存时,memcache就会罢工。如果所有的key都没有过期,它们会一直覆盖上次写入的数据,而redis只是会慢一些,不会影响程序的逻辑。
