Memcached Client的释疑

时间:2023-03-09 22:17:25
Memcached Client的释疑

1.目前大多数php环境里使用的都是不带d的memcache版本,这个版本出的比较早,是一个原生版本,完全在php框架内开发的。与之对应的带d的memcached是建立在libmemcached的基础上,所以相对来说,memcached版本的功能更全一些,目前只有Linux版本 。
memcache:http://cn2.php.net/manual/en/book.memcache.php
memcached:http://cn2.php.net/manual/en/book.memcached.php  下载:https://github.com/php-memcached-dev/php-memcached/
2.memcache是原生实现的,支持OO和非OO两套接口并存。而memcached是使用libmemcached,只支持OO接口。
3.memcached还有个非常称赞的地方,就是flag不是在操作的时候设置了,而是有了一个统一的setOption()。Memcached实现了更多的memcached协议。
4.memcached支持Binary Protocol,而memcache不支持。这意味着memcached会有更高的性能。不过memcached目前还不支持长连接。

不过可以在window下用memcache,linux下用memcached,只要保证他们使用的接口一致就可以了:

Memcached/Memcache::add — 向一个新的key下面增加一个元素
Memcached/Memcache::addServer — 向服务器池中增加一个服务器
Memcached/Memcache::decrement — 减小数值元素的值
Memcached/Memcache::delete — 删除一个元素
Memcached/Memcache::flush — 作废缓存中的所有元素
Memcached/Memcache::get — 检索一个元素
Memcached/Memcache::getStats — 获取服务器池的统计信息
Memcached/Memcache::getVersion — 获取服务器池中所有服务器的版本信息
Memcached/Memcache::increment — 增加数值元素的值
Memcached/Memcache::replace — 替换已存在key下的元素
Memcached/Memcache::set — 存储一个元素

一. memcache服务器安全:

Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄 露被其他无关人员查看,重则服务器被入侵,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。 为了安全起见,做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。

现在就关于修改memcache服务器配置的问题说明如下:

1>用内网ip的方式提供web应用服务器调用,不允许直接通过外网调用,如将memcache服务器放在192.168.1.55的服务器上

2>修改端口,如改为11200

3>分配内存,如分配1024M(1G内存)

方法如下:

1>开始>运行:CMD(确定)

2>cd C:\memcached(回车)

3>memcached -m 1024 -p 11200 -l 192.168.1.55(回车)

注意,此时命令行不会回到C:\memcached>状态,并且实际上memcache服务器悄悄变为stop状态了。此窗口不可以关闭。新开一个cmd窗口

4>开始>运行:CMD(确定)

5>cd C:\memcached(回车)

6>memcached -d start(回车)可以关闭此cmd窗口。

此时可以使用新配置的memcache服务器了。

上述方法虽然解决了修改默认配置的问题,但是始终会有一个cmd窗口不可以关闭,否则就回到11211端口的默认配置。

更好的解决方案是通过修改服务的注册表配置:

1>开始>运行:regedit(回车)

2>在注册表中找到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server

3>默认的ImagePath键的值是:"c:\memcached\memcached.exe" -d runservice,改为:"c:\memcached\memcached.exe" -d runservice -m 512 -p  11200 -l 192.168.1.55(确定,关闭注册表)

4>我的电脑(右键)>管理>服务 找到memcache的服务,重新启动一次即可生效。

此时,同网段内的电脑仍然可以利用这台memcache服务器,我们限定指定的web应用服务器才能够使用,通过防火墙的方式。如只允许 192.168.1.2这台Web服务器对Memcache服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这 个可以根据自己的需要来做。

二.PHP中配置 Memcachd Client端

Memcached Client的释疑

测试代码:

1.<?php
2.$memcache = new Memcache(); //windows
3.$memcache->connect('127.0.0.1', 11211 ) or die ( "Could not connect Memcached server!" );
4.$memcache->set( 'Memcache', "hello Memcache!<br/>");
5.echo $memcache->get('Memcache');
6.?>
1.<?php
2.$memcache = new Memcached(); //linux
3.$memcache->addServer('127.0.0.1', 11211 ) or die ( "Could not connect Memcached server!" );
4.$memcache->set( 'Memcached', "hello Memcached!<br/>");
5.echo $memcache->get('Memcached');
6.?>

三.PHP中缓存示例

<?php
$sql = 'SELECT * FROM users';
$mc = new Memcache;
$mc->pconnect('127.0.0.1', 11211);
$key = md5($sql); //memcached 对象标识符
if ( !($datas = $mc->get($key)) ) {
// 在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。
echo "n".str_pad('Read datas from MySQL.', 60, '_')."n";
$conn = mysql_connect('localhost', 'test', 'test');
mysql_select_db('test');
$result = mysql_query($sql);
while ($row = mysql_fetch_object($result))
$datas[] = $row;
// 将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。
$mc->add($key, $datas);
} else {
echo "n".str_pad('Read datas from memcached.', 60, '_')."n";
}
var_dump($datas);
?>

四.安装OCS客户端(linux)

安装MEMCACHED前需要确认是否有zlib-devel包没有需要执行
yum install zlib-devel
请先检测下是否有已安装了memcached客户端包【包含源码包】如有则不需要安装,但需要重新编译增加-enable-memcached-sasl这个扩展
wget http://pecl.php.net/get/memcached-2.1.0.tgz
tar zxvf memcached-2.1.0.tgz
cd memcached-2.1.0
phpize(如果系统中有两套PHP环境,需绝对路径调用该命令/usr/bin/phpize,该路径为使用OCS的PHP环境路径)
./configure --with-libmemcached-dir=/usr/local/libmemcached --enable-memcached-sasl --with-php-config=(这后面是php-config文件绝对路径)(注意这个参数)
make
make install
最后修改php.ini文件(locate找该文件,如果系统中有两套PHP环境,需找到使用OCS的PHP环境路径,对应修改之),增加extension=memcached.so
memcached.use_sasl = 1

五.解决OCS的密码问题(linux)

OCS使用时必须输入用户名密码的这个比较烦,小弟我又弄了一个patch,解决那个SASL配置的问题,分享给大家试试。应该能解决C++/C Python PHP 等依赖libmemcached作为客户端的Application,不保证能解决所有环境下的问题哈。 
下载在此: https://github.com/ychtiger/libmemcached-OCS  
配置:
ALIYUN_OCS_ENABLE 用来标识是否开启OCS功能,如果访问OCS服务,需要设置为true 
ALIYUN_OCS_NAME OCS服务用户名 
ALIYUN_OCS_PASW OCS服务密码 
注意,环境变量一定要设置在你程序启动的用户下,建议直接在.bashrc中设置
主要下面的代码就可以运行了(注释了鉴权函数)

<?php
$memc = new Memcached();
$memc->setOption(Memcached::OPT_COMPRESSION, false);
$memc->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
$memc->addServer("10.232.X.X", 11211);
//$memc->setSaslAuthData("username", "password");//鉴权函数可以取消了
while(1)
{
  $memc->set("key", "get OCS value");
  $result = $memc->get("key");
  var_dump($result);
  sleep(1);
}
?>