Linux安装配置memcached并启用PHP支持
最近在服务器上部缓存系统,记录一下PHP安装memcached扩展。
# 安装服务端
yum install memcached -y
I. launchpad
请于https://launchpad.net/libmemcached/+download下载目前最新版的libmemcached(20150524)
cd /tmp
wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
tar zxf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure
make
make install
II. 安装memcached扩展
在PECL(The PHP Extension Community Library)找到并安装php的memcached扩展。
在PECL中你能找到以下两个容易混淆的memcache的PHP扩展,你能够分清楚他们的区别吗?你知道为什么我们要用前者吗?请读者紫星Google之!
memcached PHP extension for interfacing with memcached via libmemcached library
memcache memcached extension
[https://pecl.php.net/package/memcached][4] 目前最新版为2.2.0
mkdir /usr/src/php -p
cd /usr/src/php
wget https://pecl.php.net/get/memcached -O memcached-2.2.0.tgz
tar xf memcached-2.2.0.tgz
cd memcached-2.2.0
phpize
# 我们在配置的添加一些新的功能,使其支持json和igbinary,有空可以研究一下
./configure --enable-memcached --enable-memcached-json --enable-memcached-igbinary
make
make install
# 注意最后的输出
# Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
下面我们将其移
动到php的extension目录下
cp /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/*.so /usr/local/php/lib/php/extensions/
III. 配置PHP.ini
打开正在生效的php.ini文件
vim /usr/local/php/etc/php.ini
# 添加以下配置
[Memcached]
extension=memcached.so
php带有操作memcached的扩展,它提供一组函数来操作memcached服务器,将他们简单分一下类:
1。memcached的连接函数(connect, pconnect)
2。memcahced的操作函数(set, get, delete, replace, flush)
3。多服务器配置函数(addServer)
4。状态监控函数(getStats.....)
下面摘一段代码,给大家一个直观的印象:(假设memcached安装在172.10.10.10上面,端口号12121)
$memcache = new Memcached();
$memcahce->connect('172.10.10.10', 12121);
$memcache->set('Key', 'Value');
$memcache->get('Key');
上面的主要完成了memcached的简单操作流程:连接memcached服务器,设置值,取值('Key'的值是'Value');
这里需要向大家说明一下addServer函数和connect函数,addServer是将多个服务器放在连接池,而connect只是将连接某一台服务器;如果在使用了addServer,再使用connect,这里就会只使用一台服务器。
介绍了memcached的使用后,下面向大家介绍如何编写自己的php memcached的客户端。
memcached是一个服务器端程序,我们自然可以使用php中的套接字程序来连接,并进行相应的通讯,完成数据的存储操作。要使用php和 memcached通讯,首先需要知道memcached的通讯协议,相关的信息可以在memcached的源码的doc/protocol.txt中找到。
这里笔者使用get命令向大家展示一下这个过程
这个命令主要是从数据中提取数据,输入格式: get key\r\n
如果服务器没有这个值,则返回: END\r\n
如果这个值存在,返回: VALUE key <标记> <数据长度> \r\n 数据块\r\n
以下代码是简单模拟的客户端操作
$fp = fsocketopen('172.10.10.10', 12121, $errorno, $errstr, 1);
if(!$fp)
echo "$errstr";
else
{
$out = "get key \r\n";
fwrite($out);
while(!feof($fp))
$str . = fgets($fp);
if(stripos($str, 'END') ===0)
exit("NO value find")
$arr = implode('\r\n', $str);
echo $arr[1];
}
简单解释上面的代码,使用fsocketopen打开服务器的socket通讯接口,然后向其发送get key命令, 然后获取返回的数据,并解析返回的数据。这里都没有做异常的处理,在编程的时候要填上
我们添加数据的时候,如果
bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )
如果报 expire 设为0 表示,永不过期.(只要memcache不重新启动,就永远在mem中)
exprie 直接给的是秒数,则最大 30*3600*24
如果你希望保持时间超过30 time()+天数*3600*24 即可
<?php
//创建一个mem对象实例
$mem=newMemcache;
if(!$mem->connect("127.0.0.1",11211)){
die('连接失败!');
}
//增加
//1.增加一个字串
/* if($mem->set('key1',"beijing",MEMCACHE_COMPRESSED,60)){
echo'添加ok';
}*/
//查询
$val=$mem->get('key1');
var_dump($val);
//修改
//可以使用replace
if($mem->replace("key11",'hello',MEMCACHE_COMPRESSED,60)){
echo'replace ok';
}else{
echo'replace no ok';
}
//删除
echo"<br/>";
if($mem->delete('key14')){
echo'key14 删除';
}else{
echo'key14不存在';
}
?>
分布式memcached测试:
<?php
//我的电脑上有两个memcahced服务.
$mem=new Memcache;
$mem->addServer('127.0.0.1',11211);
$mem->addServer('127.0.0.1',9999);
$mem->addServer('127.0.0.1',9998);
//这里注意,把key1,放入到 11211端口的mem还是
//9999 端口的mem就不要我们操心,有$mem对象本身维护.
if($mem->set('key1','hello',MEMCACHE_COMPRESSED,300)){
echo 'add ok!';
}
if($mem->set('key2','hello2',MEMCACHE_COMPRESSED,300)){
echo 'add ok!';
}
if($mem->set('key3','hello3',MEMCACHE_COMPRESSED,300)){
echo 'add ok!';
}
?>
总结:
1. mem服务的数据不是同步的, 数据是分布的
2. 把什么数据放入到哪个memcached是由客户端的mem对象决定
3. 当执行addServer的时候,并不是立即去连接mem服务,而是通过计算,hash后才去决定连接哪个mem服务,因此当你大量加入服务器到连接池,没有多余开销
u memcache的细节讨论
① 生命周期
从数据放入mem开始计时,直到时间到了,就销毁, 如果时间为0, 则表示不过期.
memcache的数据被销毁的情况如下:
1. 时间到
2. 重启memcached服务
3. 重启memcached服务所在的机器
4. delete / flush 销毁数据
② 如何把session数据放入到memcached服务中.
步骤:
1. 修改php.ini的配置文件
如下:
;[sesson.save_handler有user|files|memcache]
session.save_handler= memcache
session.save_path= "tcp://127.0.0.1:11211"
③ 测试一把,重启apache
测试ok
<?php
//传统的代码
session_start();
$_SESSION['name']='天龙八部300';
$_SESSION['city']='beijing';
class Dog{
public $name;
}
$dog1=new Dog;
$dog1->name='abcde';
$_SESSION['dog']=$dog1;
//如果session数据入mem,那他一定是以session_id为
//key值进行添加
//取出
$name=$_SESSION['name'];
echo "name=$name";
echo "sessionid=".session_id();
思考,如果管理员,不让我们修改php.ini 文件,我们如何处理session入memcached这个功能, 我们通过一个函数可以去修改 php.ini 的配置.
代码:
<?php
ini_set("session.save_handler","memcache");
ini_set("session.save_path","tcp://127.0.0.1:9999");
同时你也可以通过 ini_set 去动态的修改对php.ini 的其它设置 。但是他不影响其它php页面,也不会去修改php.ini 文件本身, 只对本页面生效.
memcached vs session比较
memcached 主要的目的是提速 ,因此它是一种无状态的数据.即,数据不和用户绑定.
session数据是和绑定的,因此是一种有状态数据.
memached安全性
如何使用memcached 服务才是安全的.
在windows下通过启用防火墙来保护我们的memcached
在linux 也可以使用防火墙.
setup 配置防火墙
iptables -ainput -p tcp -s 127.0.0.1 -dport 11211 -j ACCEPT