一、场景介绍
用户在运用PHP建立网站时,会把一些信息存放在$_SESSION大局变量里,能够很便利的存取。在PHP的ini配备文件里边供给了[Session]相关配备,能够支撑将信息存到文件或memcached里边。由配备项session.save_handler = memcached决议。大多数场景,该session数据并不需求耐久化,且为了提高网站功能,会挑选将session信息缓存到memcached里边。
二、问题
现在问题来了,已知阿里云OCS是完成了规范memcached协议的缓存,用户一方面为了削减内存占用,一方面削减对memcached的保护,期望将session的存储从自建的memcached迁移到OCS上面,且不期望改写代码。切换过程中遇到了问题,因此有了这篇文章,期望能帮到咱们。
首要澄清OCS和自建memcached的差异,他们都完成了规范memcached协议。但OCS是分布式集群一致对外供给服务,完成了负载均衡且无单点故障,用户可自在动态弹性调整配备且无需重启服务。既然是对外供给服务,就有相应的安全机制,如白名单、流控、账号暗码鉴权。这儿比照自建memcached,最重要的差异便是“账号暗码鉴权”,由于大多数用户自建memcached是不需求设置账号暗码的,跟OCS比就少了SASL鉴权流程。那么用户将session的存储从自建的memcached迁移到OCS上面,就需求在php.ini中配备账号暗码。
三、处理
1、在老版别的php memcached扩展中无法支撑,需求晋级php memcached扩展至2.2.0版别。从头依照阿里云OCS官网教程http://help.aliyun.com/view/11108324_13703944.html?spm=5176.7150518.1996836753.9.OZnEq0 编译扩展。过程如下:
wget http://pecl.php.net/get/memcached-2.2.0.tgz
tar zxvf memcached-2.2.0.tgz
cd memcached-2.2.0
phpize
./configure –with-libmemcached-dir=/usr/local/libmemcached –enable-memcached-sasl
make
make install
2、找到刚晋级memcached.so,stat指令确定下是否更新,留意下modify时刻

3、修正php.ini配备
3.1 session段
找到[Session]阶段,修正存储引擎为:
session.save_handler = memcached(留意是带d扩展)
修正存储地址,即OCS拜访地址为:
session.save_path = “be6b6b8221cc11e4.m.cnhzalicm10pub001.ocs.aliyuncs.com:11211″(留意带d扩展,则前面不必加tcp://,不带d的扩展需求加)
修正缓存到memcached的key的时刻
session.gc_maxlifetime = 1440(单位是秒,强烈建议有必要设置一个合理时刻,以确保OCS一直只缓存抢手数据)
3.2 memcached段
在php.ini的大局段,建一个独自阶段[memcached],然后在空白当地参加下面配备
[memcached]
memcached.use_sasl = On
memcached.sess_binary = On
memcached.sess_sasl_username = “your_ocs_name”
memcached.sess_sasl_password = “your_ocs_password”
memcached.sess_locking = Off
装置过程结束,上述关于memcached段和Session段其他有用参数,参阅链接如下:
http://php.net/manual/en/memcached.configuration.php
http://php.net/manual/en/session.configuration.php
接下来是测验是否收效。
四、测验
写测验代码如下session.php
<?php
session_start();
$sn = session_id();
echo “session id:”.$sn.”\n”;
$_SESSION["ocs_key"]=”session_value”;
echo “session:”.$_SESSION["ocs_key"].”\n”;
?>
输出如下:
session id:ttrct9coa2q62r2sodlq4qf376
session:session_value
测验代码get.php去从OCS获取方才session.php经过session写入的数据
<?php
$memc = new Memcached();
$memc->setOption(Memcached::OPT_COMPRESSION, false);
$memc->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
$memc->addServer(“be6b6b8221cc11e4.m.cnhzalicm10pub001.ocs.aliyuncs.com”, 11211);
$memc->setSaslAuthData(“your_ocs_name”, “your_ocs_password”);
echo $memc->get(“memc.sess.key. ttrct9coa2q62r2sodlq4qf376″);
/*留意这儿的key是有前缀的,由php.ini中memcached.sess_prefix字段决议,默认值为“memc.sess.key.”。然后再拼接上面打出来的sessionid“ttrct9coa2q62r2sodlq4qf376”即可。*/
?>
该代码输出如下:
ocs_key|s:13:”session_value”;
即PHP SESSION现已成功写入OCS。