通过php程序操作Memcached服务几种形式
- Memcache 扩展
- Memcached 扩展
- Socket套接字操作 memcached-client.php(函数)
对于php扩展来说,danga公司为了能够让php程序能够操作memcached,专门提供了一套供php使用的扩展程序(即php_memcache.dll)
使用扩展来操作memcached服务
(1) 把 php_memcache.dll 文件拷贝 php的ext 下
☞ 不同版本的php 所使用的 php_memcache.dll 的版本不一样
(2) 修改php.ini文件,加载 php_memcache.dll (该文件就是封装了一堆函数)
;加载php_memcache.dll 文件
extension=php_memcache.dll (.dll扩展程序是用vc将c或c++程序编译而成的。)
(3) 重新启动apache
(4) 我们写程序来完成curd操作.
细节: 在我们添加数据的时候,如果
bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )
如果报 expire 设为0 表示,永不过期.(只要memcache不重新启动,就永远在mem中)
exprie 直接给的是秒数,则最大 30*3600*24
如果你希望保持时间超过30 time()+天数*3600*24 即可
mem1.php
<?php //创建一个mem对象实例 $mem=new Memcache; if(!$mem->connect("127.0.0.1",11211)){//打开一个memcached服务端连接 die('连接失败!'); } //增加 //1.增加一个字串 //Memcached::add(...)如果已经有key1则返回false.Memcached::set(...),key1存在则替换,key1不存在则添加 /*if($mem->set('key1',"beijing",MEMCACHE_COMPRESSED,60)){ echo '添加ok'; }*/ //2.添加数值 /* if($mem->set('key1',100,MEMCACHE_COMPRESSED,60)){ echo '添加ok'; }*/ //3.添加数组 //在添加数组是,根据需要. 希望序列号放入 , //serialize<=>unserialize, 如果根据需要,也可以json_encode <=> json_decode
//serialize目的是用来使数组或对象能够存储和进行网络传输
$arr=array("bj",'tj'); if($mem->set('key1',$arr,MEMCACHE_COMPRESSED,time()+31*3600*24)){ echo '添加数组ok'; } //4.添加对象 /*class Dog{ public $name; public $age; public function __construct($name,$age){ $this->name=$name; $this->age=$age; } } $dog1=new Dog('小狗',50); if($mem->set('key1',$dog1,MEMCACHE_COMPRESSED,60)){ echo '添加对象ok'; }*/ //5.添加null 布尔值 /*if($mem->set('key1',false,MEMCACHE_COMPRESSED,60)){ echo '添加布尔ok'; }*/ //6. 资源类型放入. /*$con=mysql_connect("127.0.0.1","root","root"); if(!$con){ die('连接数据库失败'); } var_dump($con); echo "<br/>"; if($mem->set('key1',$con,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('key1')){ echo 'key1 删除'; }else{ echo 'key1不存在'; }
使用PHP源码来操作memcached服务
如果管理员不让我们去加载 memcache.dll 文件,我们可以直接通过源码操作.一般在不能加入扩展的情况下,使用源码操作
首先关闭php_memcache.dll扩展,接着看mem3.php代码:
require_once 'memcached-client.php'; $mc = new memcached(array( 'servers' => array('127.0.0.1:11211'), //连接的memcacheip和端口 'debug' => false, //是否debug 'compress_threshold' => 10240, /*最大压缩*/ 'persistant' => true)); /*是否是持久连接*/ $mc->set('key1', array('some', 'array')); // $mc->replace('key', 'some random string'); $val = $mc->get('key1'); var_dump($val); //修改 $mc->replace('key1', "北京"); $val = $mc->get('key1'); var_dump($val); //删除 $mc->delete('key1'); $val = $mc->get('key1'); echo "删除后"; var_dump($val);
使用源码操作memcached的特点:
1.不需要开启memcache扩展
2.使用fsockopen()套接字连接memcached
3.同样执行执行CRUD
memcached分布式介绍:
php连接memcache服务器方式:
- Memcache::connect打开一个memcached服务端连接
- Memcache::addServer向连接池中添加一个memcache服务器
当连接池中有多个memcache服务器的时候,客户端会采用分布式算法,确定key值到底保存到哪台memcache服务器。
案例:mem4.php
//我的电脑上有两个memcached服务 $mem = new Memcache; $mem->addServer('127.0.0.1',11211); $mem->addServer('127.0.0.1',9999); //这里主义,把key1,放入到11211端口的mem还是9999端口的mem就不要我们操心,有$mem对象本身维护(hash散列算法) if($mem->add('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!'; }
mem5.php
//如何从多个mem中取出你的key值? $mem = new Memcache; $mem ->addSever('127.0.0.1',11211); $mem ->addSever('127.0.0.1',9999) $val=$mem->get('key1'); echo '程序中取出分布的值='.$val;
总结:
- mem服务的数据不是同步, 数据是分布的
- 把什么数据放入到哪个memcached是由客户端的mem对象决定
- 当执行addServer的时候,并不是立即去连接mem服务,而是通过计算,hash后才去决定连接哪个mem服务,因此当你大量加入服务器到连接池,没有多余开销