PHP实现多服务器session共享之NFS共享的方法
2015-01-24信息快讯网
前言,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
最后,在这两个主机上对 php.ini 增加/修改上面提到的内容,然后重启apache即可。
php面向对象全攻略 (十) final static const关键字的使用
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
不要轻信 PHP_SELF的安全问题
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
php download.php实现代码 跳转到下载文件(response.redirect)
PHP has encountered an Access Violation at 7C94BD02解决方法
PHP 实现多服务器共享 SESSION 数据
彻底杜绝PHP的session cookie错误
php addslashes 函数详细分析说明
php session 错误
PHP session有效期问题
php session应用实例 登录验证
用header 发送cookie的php代码
用PHP实现多服务器共享SESSION数据的方法
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
实现了一个PHP5的getter/setter基类的代码
PHP+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
PHP has encountered an Access Violation
isset和empty的区别
用php实现像JSP,ASP里Application那样的全局变量
require(),include(),require_once()和include_once()的异同
一个PHP操作Access类(PHP+ODBC+Access)
傻瓜化配置PHP环境――Appserv
《APMServ 5.1.2》使用图解
使用数据库保存session的方法
在PHP3中实现SESSION的功能(一)
在PHP3中实现SESSION的功能(三)
在PHP3中实现SESSION的功能(二)