前言,Nio大侠提出了session多服务器共享的问题,原文请见
PHP 实现多服务器共享 SESSION 数据。其中,有一种方法就是利用NFS来共享session,如果session量比较大并且所有的session文件都在同一个子目录下的话,那么可能会由此带来很严重的负载问题,甚至导致网站无法使用。本文就是对这个方案做一下详细的解说。
首先,修改 php.ini的
session.save_path
选项,大致如下:
session.save_path = "2;/tmp/php_sess"
意为把session存放在
"/tmp/php_sess"
目录下,并且分成 2 级子目录,每级子目录又分别有 16 个子目录。
接下来,假设php的主目录为
/usr/local/server/php/
,则新建一个文件
/usr/local/server/php/include/php/ext/session/mod_files.sh
,其内容如下:
#! /bin/sh
# NAME
# mod_files.sh - Update of the php-source/ext/session/mod_files.sh
#
# SYNOPSIS
# mod_files.sh basedir depth [numberofsubdirs]
#
# DESCRIPTION
# this script creates the directories tree used by php to store the session files
# (see php.ini - 'session.save_path' option)
#
# Example: if you want php to store the session files in a directory tree
# of 3 levels of depth containing 32 directories in each directory,
# first, put the setting bellow in the php.ini file:
#
# session.save_path = "3;/tmp/session"
#
# Now create the basedir directory: 'mkdir /tmp/session'
#
# Then, call this scrip with the following arguments:
#
# ./mod_files.sh ./mod_files.sh /tmp/session 3 32
if test "$2" = ""; then
echo "usage: $0 basedir depth [numberofsubdirs]"
echo "numberofsubdirs: if unset, defaults to 16. if 32, 32 subdirs, if 64, 64 subdirs."
exit 1
fi
if test "$2" = "0"; then
exit 0
fi
hash_chars="0 1 2 3 4 5 6 7 8 9 a b c d e f"
if [ ! -z $3 ] ; then
if test "$3" -a "$3" -eq "32"; then
hash_chars="$hash_chars g h i j k l m n o p q r s t u v"
if test "$3" -eq "64"; then
hash_chars="$hash_chars w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z - ,"
fi
fi
fi
for i in $hash_chars; do
newpath="$1/$i"
mkdir $newpath || exit 1
sh $0 $newpath `expr $2 - 1` $3
done
设置为可执行之后,运行以下命令来创建哈希目录:
shell>#cd /usr/local/server/php/include/php/ext/session/
shell>#./mod_files.sh /tmp/php_sess 2 16
现在,就开始设置 NFS 共享了。假定有3台主机,ip分别为192.168.0.1(主机名svr1)、192.168.0.2(主机名svr2)、192.168.0.3(主机名svr3),现在让192.168.0.1来提供NFS共享服务,配置
/etc/exports
,加入如下内容:
/tmp/php_sess/ svr*(rw,no_root_squash)
然后重启 nfs 服务,即可对另外两台主机提供NFS共享了。
在 svr2、svr3 上执行以下命令来挂在NFS:
shell>#mkdir /tmp/php_sess
shell>#mount svr1:/tmp/php_sess /tmp/php_sess
用NFS来存储session的缺点是,session过期后不能自动清除,必须自己设定回收机制,我们可以利用crontab来定期回收,用用以下shell命令即可:
find /tmp/php_sess -mmin +30 | xargs rm -fr
意思是,删除30分钟以前的session文件,具体的时间请大家自己重新设置吧。
最后,在这两个主机上对 php.ini 增加/修改上面提到的内容,然后重启apache即可。顺祝大家新年好运!
本文出自 “老叶茶馆” 博客,转载请与作者联系!
转载于:https://my.oschina.net/yejr/blog/878610
分享到:
相关推荐
### PHP实现多服务器Session共享之NFS共享的方法详解 #### 前言 在Web开发中,当系统架构从单一服务器扩展到多服务器时,如何确保Session数据在多个服务器之间保持一致性和可用性成为了关键问题之一。对于使用PHP...
通过这种方式,无论用户请求哪个服务器,只要Session ID相同,服务器都能从Memcache中获取到相应的Session数据,从而实现跨服务器Session共享。 这种方案的优点在于,Memcache的分布式特性可以轻松地扩展到更多的...
在多服务器环境下实现SESSION共享是一个常见的需求,尤其对于那些拥有多个模块、二级域名的大型网站。这种架构需要用户在网站的不同部分之间无缝切换,而不需要重复登录。要解决这个问题,我们必须先理解PHP中...
3. 在lamp1和lamp2服务器上安装LAMP环境,配置应用并连接到Nfs共享。 4. 在st.linuxfan.cn服务器上设置Nfs服务器,共享Web内容目录,并允许其他服务器挂载。 5. 配置DNS或hosts文件,将www.linuxfan.cn指向VIP地址。...
对于 Linux 系统,可以通过 NFS 或 Samba 共享来实现跨服务器的数据同步;而在 Windows 系统上,则可以通过共享文件夹的方式实现。 ##### 2.2 数据库存储 除了文件系统外,还可以将 Session 数据保存在数据库中。...
这可以通过共享存储(如NFS)、使用集中式缓存(如memcached或Redis)或利用加密的Cookie实现跨服务器的Session传递。 总的来说,理解PHP Session的工作原理以及如何优化其性能对于开发高效且可靠的Web应用至关重要...
3. **session共享**:为了确保用户会话在集群间正常迁移,需要配置session存储机制,如使用Redis或Memcached作为共享session存储。 4. **文件共享**:静态资源和上传文件需要在所有服务器之间共享,可以借助NFS...
1. 使用NFS(网络文件系统)或Samba进行文件共享:这种方法涉及设置一台专门的服务器,用于存储所有session文件,并通过NFS或Samba协议让其他服务器能够访问。这样,所有服务器都能读取到同一份session数据,解决了...
在这种情况下,一个可行的解决方案是将Session文件存储在一个网络共享的文件系统(如NFS)上,使得多台Web服务器能够访问同一套Session数据。但需要注意的是,NFS可能会引入额外的延迟,并且PHP生成Session文件时...
利用NFS共享Session数据 - B. 基于数据库的Session共享 - D. 使用类似BIG-IP的负载设备来实现资源共享 选项C基于Cookie的Session共享通常不是一种安全的共享方式,因为Cookie可以在客户端被修改。因此,正确答案...
- **项目3**:文档分享网站,使用nginx实现反向代理和负载均衡,nfs进行session共享,mysql主从同步实现读写分离。 - **项目4**:OA办公管理系统,采用了snoopy信息采集技术。 以上知识点体现了PHP工程师应具备的...
通过NFS、Samba或云存储服务实现文件共享,确保所有服务器都能访问这些资源。 5. **缓存策略**:利用缓存(如Varnish或Redis)可以显著提升动态内容的加载速度,减轻后端服务器压力。缓存策略包括全页缓存、片段...
- 文件服务器(如NFS):集中存储,但单点故障风险较高。 2. **文件上传处理**: - 存储到数据库:数据安全性高,但数据库压力大,服务器故障可能导致文件无法访问。 - 文件服务器共享:易于访问,但单点故障...
为了维持用户会话,可以采用源IP Hash、Session共享、Session Sticky(粘滞会话)或Session复制等策略,确保用户请求始终被定向到同一台服务器。 7. **数据库架构扩展** 针对读多写少的场景,采用主从复制、读写...
Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用...