CodeIgniter框架优化—Session驱动器支持SASL用户名密码认证
前言:
前段时间闲下来有点小空余时间,刚好需要部署CodeIgniter应用到集群服务器上面。新加了Session存储,同时又使用的是阿里云的Memcached服务,将Session存储在Memcached里面去,但是在实际应用过程中就发现,阿里云的Memcached由于是内网服务,并且在未手动开启指定内网服务器内网访问的情况下,是无法使用Session的,这就极大的增加了整个系统的局限性,所以,研究了一下CI的Session_Memcached驱动器,并做了一个小小的修改,使得CI的Session_Memcached驱动器支持SASL用户名密码认证。
系统环境
Ubuntu14.14 LTS + PHP5.5 + Apache2.4
首先在服务器上需要安装php5-dev libsasl2-dev cloog-ppl libmemcached memcached等扩展,用来支持SASL认证
apt-get -y update
apt-get -y install php5-dev
apt-get -y install libsasl2-dev cloog-ppl
wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
tar -zxvf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure --prefix=/usr/local/libmemcached
make && make install
cd ..
wget http://pecl.php.net/get/memcached-2.2.0.tgz
tar -zxvf memcached-2.2.0.tgz
cd memcached-2.2.0
phpize5
./configure --with-libmemcached-dir=/usr/local/libmemcached --enable-memcached-sasl
make && make install
echo "memcached.use_sasl = 1" >>/etc/php5/apache2/conf.d/20-memcached.ini
接下来就是修改CI框架了。
system\libraries\Session\drivers\Session_memcached_driver.php
修改:
第73行成员属性中新增:
protected $_ocs_username;
protected $_ocs_password;
第94行构造方法中新增:
if (empty($this->_config['ocs_username']))
{
log_message('error', 'Session: No Memcached Username configured.');
}else{
$this->_ocs_username = $this->_config['ocs_username'];
}
if (empty($this->_config['ocs_password']))
{
log_message('error', 'Session: No Memcached Password configured.');
}else{
$this->_ocs_password = $this->_config['ocs_password'];
}
第128行open()方法中新增:
$this->_memcached->setOption(Memcached::OPT_COMPRESSION, false); //关闭压缩功能
$this->_memcached->setSaslAuthData($this->_ocs_username, $this->_ocs_password );
$this->_memcached->setOption(Memcached::OPT_TCP_NODELAY, true);//重要,php memcached有个bug,当get的值不存在,有固定40ms延迟,开启这个参数,可以避免这个bug
Config文件中新增2个配置项:
Config/Config.php中,
在$config['sess_save_path'] = "OCS地址";
下一行新增
$config['ocs_username'] = 'xxxxxx';
$config['ocs_password'] = 'xxxxxx';
修改完成后的Memcached存储session的配置 如下:
$config['sess_driver'] = 'memcached';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:11211";
$config['ocs_username'] = 'XXXXXX ';
$config['ocs_password'] = 'XXXXXX';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
附上linux一键执行脚本(不建议直接执行,建议手动编译安装):
#!/bin/bash
set -o errexit
USAGE="This script will automaticlly Update Server to Support Memcached SASL Authentication
Please input OK to continue the installtion"
printUsage() {
apt-get update -y
apt-get install -y lrzsz unzip zip
clear
echo -e "\033[32m$USAGE\033[0m"
}
install_SupportSoft(){
apt-get -y install php5-dev libsasl2-dev cloog-ppl pkg-config
}
install_libmemcached(){
cd /tmp/
wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
tar -zxvf libmemcached-1.0.18.tar.gz
rm libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure --prefix=/usr/local/libmemcached
make && make install
cd ..
}
install_memcached(){
cd /tmp/
wget http://pecl.php.net/get/memcached-2.2.0.tgz
tar -zxvf memcached-2.2.0.tgz
rm memcached-2.2.0.tgz
cd memcached-2.2.0
phpize5
./configure --with-libmemcached-dir=/usr/local/libmemcached --enable-memcached-sasl
make && make install
cd ..
}
config_apache(){
echo "memcached.use_sasl = 1" >>/etc/php5/apache2/conf.d/20-memcached.ini
service apache2 restart
}
printUsage
read PARAMS
if [ "$PARAMS"x == "OK"x ]; then
install_SupportSoft
install_libmemcached
install_memcached
config_apache
else
echo -e "\033[31mInput Error, TYPE ANY KEY TO EXIT!\033[0m"
read answer
echo -e "\033[36mExiting And Cleaning\033[0m"
fi