默认情况下,php的session文件是保存在磁盘文件中。在php.ini配置文件中的配置项如下:
session.save_handler = files session.save_path = "N;/path"
第一个配置项是指定使用files(文件形式)存储session数据。
第二个参数指定保存的路径。N表示生成多少级目录(不放到一个目录下,分散到多个磁盘目录中去)
当我们使用php的内置函数session_start()的时候,就是去上面指定的磁盘目录把session数据载入,实际上就是拿类似 sess_74dd7807n2mfml49a1i12hkc45的文件。
php.ini中还有一个关键配置项,如下:
session.name = PHPSESSID
PHPSESSID就是cookie的名称,其实上面一串"74dd7807n2mfml49a1i12hkc45"会保存在一个名为PHPSESSID的cookie中。
根据http的请求机制,当浏览器请求的时候,头部信息会把浏览器中的cookie一起发给服务器。PHPSESSID这个cookie也是在其中发给了服务器,php引擎通过读取PHPSESSID的值来确定要载入哪个session文件。比如值为74dd7807n2mfml49a1i12hkc45,载入的为"sess_74dd7807n2mfml49a1i12hkc45"。
注:当你调用php的函数session_start(),才表明你需要使用session文件了。不然平白无故就去载入文件,浪费性能。
根据如上原理。session的数据默认是保存在磁盘文件中。假设这种情况:多台php服务器进行负载均衡的时候,比如有三台php服务器,为了实现负载均衡,那么三台服务器上面的php代码都是一样(拷贝一份)。
上面的图是nginx+fpm部署图。可以看到多台php服务器进行负载均衡。
生成session数据文件都是在本地了(a,b,c各自的服务器磁盘上)。负载均衡的目的本来就是要为了平均分配请求,所以没有固定第一次访问和第二次访问是同一台服务器,实际上无法确定的。第一秒访问可能是a服务器,第二秒访问的可能是c服务器。
所以同一个登录会员,实际上就会出现:第一秒访问第一台php服务器,第二秒访问的是第二台服务器。登录的信息一般是保存在session中的。这样子登录保存的session数据就需要进行共享了。不然的话会出现,访问第一台服务器生成了一个session数据。第二秒负载请求到第三台服务器,结果获取不到刚才生成的session数据。
我的理解是:只有涉及到多台多台后端服务器(php,java等处理服务器)的时候,才涉及到session读取不到的问题。
在php环境中,只有多台php服务器(php服务器而非web服务器,session文件是php引擎生成的)的情况下,才会涉及到session共享的问题。单台php服务器,存储都在一台主机上, 不涉及到共享问题。因为session直接存储在这台服务器磁盘上是能够被本机读取到的。如果是:一台php服务器,多台mysql服务器。这种也是负载均衡,这种负载均衡不涉及到共享问题。因为怎么session数据怎么操作都是保存在一台服务器上。
实际开发中涉及到用户的Session验证很保留的问题,这个问题比较有意思,总结了几种方案,供参考。
[ 问题提出 ]
为了满足足够大的应用,满足更多的客户,于是我们架设了N台Web服务器(N>=2),在多台Web服务器的情况下,我们会涉及到一个问题:用户登陆一台服务器以后,如果在跨越到另一台服务器的时候能够继续使用客户的Session?
(以下描述方案只是针对Linux/Unix + Apache + Mysql +PHP的开发架构,当然,也可以扩展到其他平台。)
[ 问题解决方案 ]
既然我们的问题已经摆在面前了,那么就要从技术角度去解决问题,给我们的客户更好的体验,总结了几个方案。
1. 写客户端Cookie的方式
当用户登陆成功以后,把网站域名、用户名、密码、token、session有效时间全部采用cookie的形式写入到客户端的cookie里面,如果用户从一台Web服务器跨越到另一台服务器的时候,我们的程序主动去检测客户端的cookie信息,进行判断,然后提供对应的服务,当然,如果cookie过期,或者无效,自然就不让用户继续服务了。当然,这种方法的弊端就不言而喻了,比如客户端禁用了cookie或者cookie被黑客窃取了呢?
2. 服务器之间Session数据同步的方式
假设Web服务器A是所有用户登陆的服务器,那么当用户验证登陆一下,session数据就会写到A服务器里,那么就可以自己写脚本或者守护进程来自动把session数据同步到其他Web服务器,那么当用户跳转到其他服务器的时候,那么session数据是一致的,自然就能够直接进行服务无须再次登陆了。缺点是,可能会速度慢,不稳定,如果是单向同步的话,登陆服务器出现问题,那么其他服务器也无法服务,当然也可以考虑双向同步的问题。
3. 利用NFS共享Session数据的方式
其实这个方案和下面的Mysql方案类似,只是存储方式不一样。大致就是有一台公共的NFS服务器(Network File Server)做共享服务器,所有的Web服务器登陆的时候把session数据写到这台服务器上,那么所有的session数据其实都是保存在这台NFS服务器上的,不论用户访问那太Web服务器,都要来这台服务器获取session数据,那么就能够实现共享session数据了。缺点是依赖性太强,如果NFS服务器down掉了,那么大家都无法工作了,当然,可以考虑多台NFS服务器同步的形式。
(关于NFS的经典文章:http://linux.vbird.org/linux_server/0330nfs.php)
4. 利用Mysql数据库共享Session数据的方式
这个方式与NFS的方式类似,也是采用一台Mysql服务器做共享服务器,把所有的session的数据保存到Mysql服务器上,所有Web服务器都来这台Mysql服务器来获取Session数据。缺点也是依赖性太强,Mysql无法工作了影响所有的Web服务器,当然,可以考虑多太Mysql数据库来共享session,使用同步Mysql数据的方式。
(Mysql同步我写过文章:http://blog.csdn.net/heiyeshuwu/archive/2005/10/31/520007.aspx)
5. 使用硬件设备
这个算是比较成熟的解决方案了,使用类似BIG-IP的负载设备来实现资源共享,那么就能够又稳定又合理的的共享Session了。目前很多门户网站采用这种方式。缺点很明显了,就是要收费了,硬件设备肯定需要购买成本的,不过对于专业或者大型应用来讲,是比较合理并且值得的。
参考文章:
http://www.cnblogs.com/wangtao_20/archive/2013/10/29/3395518.html
http://blog.csdn.net/lerdor/article/details/8138825
相关推荐
具体的实现细节和技术选型需要结合项目实际情况来确定,例如《多台服务器共享SESSION - 学在囧途的日志 - 网易博客》和《多服务器共享session的方法》这两篇文章可能提供了更深入的实践案例和技术解析,值得进一步...
然而,当一个网站部署在多台服务器上时,单个服务器上的session无法在其他服务器之间共享,这可能导致用户在切换服务器时丢失其会话信息。 此时,就需要引入session共享技术。PHP的memcache扩展提供了一个解决方案...
但这仅解决了部分问题,如果所有服务器需要共享Session数据,还需要更复杂的解决方案。 描述中提到的“jar包”,很可能是指实现Session共享的中间件,如Redis或Memcached。这些缓存服务可以作为一个集中式的Session...
当我们在同一台服务器上部署多个Web项目时,有时需要实现不同Web项目之间的session共享,以便用户在访问一个项目时的数据能够在其他项目中继续有效。本篇文章将深入探讨如何在Tomcat服务器上实现在不同Web项目之间...
Session共享的主要目的是在多个网站或应用之间保持用户的登录状态和其他个性化信息,提高用户体验。默认情况下,ASP.NET的Session是基于Cookie的,每个Cookie都有一个特定的域限制,这意味着Session信息不能在不同的...
一、利用数据库同步session 在做多服务器session同步时我没有用这种方法,如果非要用这种方法的话,我想过二种方法: 1,用一个低端电脑建个数据库专门存放web服务器的session,或者,把这个专门的数据库建在文件...
在Web开发中,当一个应用程序部署在多个服务器上形成集群时,如何实现多个服务器之间Session的共享成为了一个关键问题。由于Session是存储在单个服务器内存中的,因此默认情况下,不同服务器无法直接访问彼此的...
通过以上步骤,可以成功地在多个Web服务器之间共享Session,解决跨域问题。Redis作为一个高性能的Key-Value数据库,对于存储和检索Session数据非常高效,是实现Session跨域共享的理想选择。在实际项目中,可以根据...
在分布式系统环境中,Web项目的集群部署能够提供高可用性和负载均衡,但同时也引入了一个问题:如何在多个服务器之间共享Session信息。"web项目集群时共享session方案实践"的主题旨在探讨和解决这一挑战。以下是关于...
以下详细阐述了如何使用PHP实现多服务器共享SESSION数据的技术知识点。 首先,要理解PHP默认的SESSION管理机制是使用session.save_handler配置项指定的处理器来读写存储在session.save_path配置项指定的目录下的...
综上所述,跨域共享session涉及到多个技术层面,包括浏览器限制、服务器配置、前端处理和安全措施。实现HTTP到HTTPS的session共享需要综合考虑这些因素,并确保在提供便利的同时,保证用户数据的安全。
标题中的“memcached实现多个tomcat共享一个session”是指在分布式系统中,通过使用memcached作为session存储介质,实现多台Tomcat服务器之间的session共享。这样可以确保用户在集群中的任意一台服务器上登录后,其...
总的来说,使用Memcache实现PHP Session的多服务器共享是一种高效的方法,特别适合高并发、分布式环境的Web应用。不过,为了提高可用性和可靠性,可以考虑结合其他持久化存储(如Redis)或使用更高级的Session管理...
为了解决这个问题,我们需要一个共享session的机制。 **解决方案**: 利用Redis作为session存储,每个Tomcat实例在接收到请求时,不再在本地存储session,而是将其保存在Redis中。Nginx在分发请求时,可以通过粘滞...
在多台Web服务器环境下处理登录问题,是分布式系统中的常见挑战,尤其是在高并发、高可用性需求的场景下。本文将探讨Struts如何在多台服务器上实现用户登录状态的一致性,并提供一些相关的工具和技术。 首先,我们...
在分布式系统中,由于用户请求可能会被路由到不同的服务器上,因此,如何在多台服务器之间共享session数据成为了一个挑战。这就是“用redis共享session”这个主题所关注的核心问题。 Redis是一个高性能的键值数据库...
在分布式系统中,Session共享是一个常见的挑战,尤其是在多个服务器或应用之间需要保持用户状态时。本文将深入探讨一种实现方式——使用Tomcat8与Redis相结合的Session共享方案。该方案旨在确保用户在集群中的任意一...
在构建分布式Web应用程序时,确保用户会话在多个服务器之间无缝地共享是一项关键任务。PHP是一种广泛使用的服务器端脚本语言,它默认的session存储机制并不适用于多服务器环境。为了解决这个问题,开发者通常会利用...
### Session在同服务器不同域名间的共享机制 #### 核心概念与原理 在现代Web开发中,Session是一种常用的技术手段,用于保存用户的状态信息。它允许服务器存储与特定客户端会话相关的数据,使得用户能够在不连续的...