• 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方法后以上比较才能成立,循环也才能顺利进行,否则将是一个死循环

  • 相关阅读:
    时间序列理论专题之二 时间序列的表达
    Ado.net Entity FrameWork的性能问题
    时间序列专题之三 时间序列的分段线性表示
    Tfs 2010使用小技巧
    时间序列理论专题之一 前言
    绝大多数新技术的学习,都是浪费生命
    Tfs2010简体中文版:翻译永远是问题
    MSsql 查询时默认是不区分大小写。 可以用语句强制sql语句查询时区分大小写 狼
    将.NET dll注册到GAC(Global Assembly Cache)中 狼
    js重载 狼
  • 原文地址:https://www.cnblogs.com/itfenqing/p/4437669.html
Copyright © 2020-2023  润新知