Memcache笔记03-php操作Memcached

时间:2022-05-05 10:16:21

通过php程序操作Memcached服务几种形式

  1. Memcache 扩展
  2. Memcached 扩展
  3. 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;

总结:

  1. mem服务的数据不是同步, 数据是分布的
  2. 把什么数据放入到哪个memcached是由客户端的mem对象决定
  3. 当执行addServer的时候,并不是立即去连接mem服务,而是通过计算,hash后才去决定连接哪个mem服务,因此当你大量加入服务器到连接池,没有多余开销