PHP实现多服务器session共享之NFS共享
前言,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即可。顺祝大家新年好运!
评论
游客 (未验证)
周五, 2007/01/05 - 09:26
Permalink
good
good
果果 (未验证)
周四, 2009/07/16 - 17:29
Permalink
NFS挂上来的文件是跟
NFS挂上来的文件是跟本机的文件系统一样吧,所以php是会去自动清除的。
我测试了一下,在 PHP Version 5.2.9 下会自动清除SESSION。
修改php.ini配置文件为:
session.gc_probability = 1
session.gc_divisor = 1
session.gc_maxlifetime = 10
可以更快看到测试结果。