zoukankan      html  css  js  c++  java
  • centos安装php-memcached扩展及cas用法


    一.安装libmemcached
    wget https://launchpad.net/libmemcached/1.0/1.0.16/+download/libmemcached-1.0.16.tar.gz
    tar -zxvf libmemcached-1.0.16.tar.gz
    cd libmemcached-1.0.16
    ./configure --prefix=/usr/local/libmemcached --with-memcached
    make &&  make install

    二.安装php-memcached
    1.安装php开发部分
    yum install php-devel

    2.安装php-memached 1.0
    wget http://pecl.php.net/get/memcached-1.0.2.tgz
    tar -zxvf memcached-1.0.2.tgz
    cd memcached-1.0.2

    #/usr/bin/phpize


    ./configure --enable-memcached --with-php-config=/usr/local/php/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached --prefix=/usr/local/phpmemcached

    此处出现错误:
    error: tr1/cinttypes

    yum install gcc44 gcc44-c++ libstdc++44-devel -y
    export CC=/usr/bin/gcc
    export CXX=/usr/bin/g++44
    执行使其生效:
    source /etc/profile

    再次configure

    然后make && make install

    3.在/etc/php.d/下新建文件
    memcached.ini
    加入
    extension=memcached.so

    4.重启apache

    5.查找php模块
    #php -m | grep memcached


    三.php memcached中cas的用法:

    1.php的memcache扩展和memcached扩展的区别在于memcached提供了一个冲突检测机制,可以保证数据并发的安全性

    2.Memcached::cas方法简介:
    public bool Memcached::cas ( float $cas_token , string $key , mixed $value [, int $expiration ] )
    Memcached::cas()执行一个“检查并设置”的操作,因此,它仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。检查是通过cas_token参数进行的, 这个参数是Memcach指定给已经存在的元素的一个唯一的64位值, 怎样获取这个值请查看Memcached::get*() 系列方法的文档。注意:这个值作为double类型是因为PHP的整型空间限制。

    cas_token

        与已存在元素关联的唯一的值,由Memcache生成。
    key

        用于存储值的键名。
    value

        存储的值。
    expiration

        到期时间,默认为 0。


    返回值

    成功时返回 TRUE, 或者在失败时返回 FALSE。 如果在元素尝试存储时发现在本客户端最后一次获取后被其他客户端修改,Memcached::getResultCode() 将返回Memcached::RES_DATA_EXISTS。

    3.代码示例:

    <?php
    $m = new Memcached();
    $m->addServer('localhost', 11211);

    do {
        /* 获取ip列表以及它的标记 */
        $ips = $m->get('ip_block', null, $cas);
        /* 如果列表不存在, 创建并进行一个原子添加(如果其他客户端已经添加, 这里就返回false)*/
        if ($m->getResultCode() == Memcached::RES_NOTFOUND) {
            $ips = array($_SERVER['REMOTE_ADDR']);
            $m->add('ip_block', $ips);
        /* 其他情况下,添加ip到列表中, 并以cas方式去存储, 这样当其他客户端修改过, 则返回false */
        } else {
            $ips[] = $_SERVER['REMOTE_ADDR'];
            $m->cas($cas, 'ip_block', $ips);
        }   
    } while ($m->getResultCode() != Memcached::RES_SUCCESS);

    ?>

    注意:$m->getResultCode() != Memcached::RES_SUCCESS

    只有在调用$m->cas或$m->add方法后以上比较才能成立,循环也才能顺利进行,否则将是一个死循环

  • 相关阅读:
    HDU6397
    容斥原理推导错排通项公式
    重复排列的证明
    圆排列证明
    rock-paper-scissors
    The more, The Better
    趁着情人节写点东西
    分层图最短路问题
    背包问题是否装满问题
    Python面向对象编程扑克牌发牌程序,另含大量Python代码!
  • 原文地址:https://www.cnblogs.com/itfenqing/p/4437669.html
Copyright © 2011-2022 走看看