zoukankan      html  css  js  c++  java
  • Memcache笔记03-php操作Memcached

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

    1. Memcache 扩展
    2. Memcached 扩展
    3. Socket套接字操作 memcached-client.php(函数)

    对于php扩展来说,danga公司为了能够让php程序能够操作memcached,专门提供了一套供php使用的扩展程序(即php_memcache.dll)

    使用扩展来操作memcached服务

    (1) 把 php_memcache.dll 文件拷贝 phpext

    ☞ 不同版本的php 所使用的 php_memcache.dll 的版本不一样

    (2) 修改php.ini文件,加载 php_memcache.dll (该文件就是封装了一堆函数)

    ;加载php_memcache.dll 文件

    extension=php_memcache.dll  (.dll扩展程序是用vccc++程序编译而成的。)

    (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服务,因此当你大量加入服务器到连接池,没有多余开销

     

  • 相关阅读:
    经典SQL语句大全
    《构建高性能Web站点》观后感
    网搜索引擎架构设计
    使用Windows系统的几个好的习惯
    静态页面对seo优化之详解
    让您SEO学习时间缩短一半的高阶秘籍
    java链表
    GAE 数据存储——事务
    GAE 博客——B3log Solo 0.2.0 发布了!
    Wine 1.3.7 发布
  • 原文地址:https://www.cnblogs.com/T8881/p/5323633.html
Copyright © 2011-2022 走看看