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

     

  • 相关阅读:
    Oracle Core 学习笔记二 Transactions 和 Consistency 说明
    Oracle AUTO_SPACE_ADVISOR_JOB 说明
    Windows 下 ftp 上传文件 脚本
    Oracle 11g 中 Direct path reads 特性 说明
    Linux 使用 wget 下载 Oracle 软件说明
    Oracle 10g read by other session 等待 说明
    Oracle 11g RAC INS06006 Passwordless SSH connectivity not set up between the following node(s) 解决方法
    SecureCRT 工具 上传下载数据 与 ASCII、Xmodem、Ymodem 、Zmodem 说明
    Oracle RAC root.sh 报错 Timed out waiting for the CRS stack to start 解决方法
    Oracle RESETLOGS 和 NORESETLOGS 区别说明
  • 原文地址:https://www.cnblogs.com/T8881/p/5323633.html
Copyright © 2011-2022 走看看