文档章节

PHP之Memcached

独孤蝈蝈
 独孤蝈蝈
发布于 2016/10/21 20:58
字数 1178
阅读 11
收藏 0

Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。

PHP有两个相关扩展,一个是Memcache,另一个是Memcached,关于区别,可另行查阅。

本篇以Memcache扩展为例。

PHP程序包默认没有包含这个扩展,可到 http://pecl.php.net/package/memcache 下载该扩展。

然后我们还需要服务器端,可到 http://memcached.org/ 下载服务端。

下面是PHP中该扩展相关的方法。

    object  new Memcache;                                               //返回一个Memcache对象
    bool    Memcache::connect(string $host, [int $port, int $timeout]); //连接到地址为host端口为port的memcached服务器
    mixed   Memcache::pconnect(string $host, [int $port, int $timeout]);//打开一个持久连接 在脚本结束或memcache::cache后不会被关闭

    //向连接池中添加一个Memcache服务器 host指定主机位置 port指定端口 persistent指定是否使用持久连接默认true
    //weight指定此服务器的权重 timeout指定连接持续时间默认1秒 retry_interval指定连接失败重试间隔-1表示不重试
    //status指定服务器是否可以被标记为在线状态 failure_callback指定发送错误后的回调函数
    bool    Memcache::addServer(string $host, [int $port = 11211, bool $persistent, int $weight, int $timeout, int $retry_interval,
                                bool $status, callback $failure_callback, int $timeoutms]);

    bool    Memcache::close(void);           //关闭到服务端的连接 不会关闭持久连接 持久连接只会在服务器关机/重启时关闭

    //将key=>var存储到服务器 var指定值 字符串和整型被以原文存储 其它类型序列化后存储(资源类型不能完整序列化)
    //flag指定是否使用zlib压缩 expire指定过期时间 0表示永不过期 可以设置一个时间戳 或 一个以秒为单位的时间差(不超过2592000)
    bool    Memcache::add(string $key, mixed $var, [int $flag, int $expire]);   //添加一个映射 如果key存在则返回false
    bool    Memcache::set(string $key, mixed $var, [int $flag, int $expire]);   //设置一个映射 存在则修改 不存在则创建
    bool    Memcache::replace(string $key, mixed $var, [int $flag, int $expire]);//修改已存在的映射 不存在返回false
    string  Memcache::get(string $key, [int &$flags]);                          //返回key对应的存储的值 如果未找到返回false
    array   Memcache::get(array $key, [int &$flags]);                           //返回找到的key=>value对数组 
    bool    Memcache::delete(string $key, [int $timeout]);                      //删除指定元素key timeout指定多少秒后失效 0立即失效
    int     Memcache::decrement(string $key, [int $value = 1]);                 //将key对应的值减去value 成功返回新值 失败返回false
    int     Memcache::increment(string $key, [int $value = 1]);                 //将key对应的值加上value 成功返回新值 失败返回false
    bool    Memcache::flush(void);                                              //删除所有已经存储的元素

    array   Memcache::getStats([string $type, int $slabid, int $limit = 100]); //返回一个服务器统计信息的关联数组
    array   Memcache::getExtendedStats([string $type, int $slabid, int $limit = 100]); //返回所有服务器统计信息组成的二维数组
    bool    Memcache::setServerParams(string $host, [int $port = 11211, int $timeout, int $retry_interval = false
                                      bool $status, callback $failure_callback]); //运行时修改服务器参数和状态

数据库的简单实例

    /**
     * 执行有结果集的SQL语句,并将结果缓存到memcache服务器中
     * @author guoguo
     * @param  string $sql 有结果集的查询语句SQL
     * @param  object $mem memcache类的对象
     * @return $data       返回的结果集
     */
    function select($sql, $mem){
        //将md5 sql命令 作为memcache的唯一标识符
        $key = md5($sql);
        //先从memcached服务器中获取数据
        $data = $mem->get($key);
        //如果$data不存在 则到数据库获取
        if(!$data){
            try{
                $pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', '123123');
            }catch(PDOException $e){
                die('错误: '.$e->getMessage());
            }
            $stmt = $pdo->query($sql);
            $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
            //将数据缓存到memcached服务器一小时
            $mem->add($key, $data, MEMCACHE_COMPRESSED, 3600);
        }
        return $data;
    }
    
    $mem = new memcache;
    $mem->connect('127.0.0.1', 11211);
    $data = select('SELECT * FROM test', $mem);
    echo '<pre>';
    var_dump($data);

使用Memcached存储sessioin

/**
     * session的memcached驱动 将session存储到memcache中
     */
    class Mc{
        protected static $prefix;                   //sessionID前缀
        protected static $mem;                      //session保存的缓存服务器
        protected static $lifetime;                 //session的有效期

        //更改默认session存储方式,使用memcached存储
        public static function start($memcache, $prefix = 'session_'){
            self::$mem      = $memcache;
            self::$prefix   = $prefix;
            self::$lifetime = ini_get('session_gc_maxlifetime');
            
            session_set_save_handler(               //使用自定义会话存储函数
                [__CLASS__, 'open'],
                [__CLASS__, 'close'],
                [__CLASS__, 'read'],
                [__CLASS__, 'write'],
                [__CLASS__, 'destroy'],
                [__CLASS__, 'gc']);
        }

        //实现回调函数open
        public static function open($savePath, $sessionName){
            return true;
        }
        //实现回调函数read
        public static function read($sessionID){
            return (string)self::$mem->get(self::$prefix.$sessionID);
        }
        //实现回调函数write
        public static function write($sessionID, $data){
            return self::$mem->set(self::$prefix.$sessionID, $data, false, self::$lifetime);
        }
        //实现回调函数destroy
        public static function destroy($sessionID){
            return self::$mem->delete(self::$prefix.$sessionID);
        }
        //实现回调函数gc
        public static function gc($maxlifetime){
            return true;
        }
        //实现回调函数close
        public static function close(){
            return true;
        }
    }

    $mem = new memcache;
    $mem->addServer('127.0.0.1', 11211);
    //更改session存储为memcache
    Mc::start($mem);
    //启动session
    session_start();
    //设置一个session
    $_SESSION['name'] = 'hello world!';
    echo $_SESSION['name'];

Memcached服务器结果如下:

© 著作权归作者所有

独孤蝈蝈
粉丝 4
博文 59
码字总数 39108
作品 0
朝阳
程序员
私信 提问
在Debian6.0(Squeeze)安装Memcached 和PHP5-Memcached

Memcached是免费和开源、高性能、分布式内存对象缓存系统,通用在自然界,但用于加速动态web应用程序,减轻数据库负载。”memcached的更多信息可以在找到http://www.memcached.org/ .本文将解释...

季书歌
2016/12/10
10
0
Plesk下安装 PHP Memcached 扩展

Plesk下安装 PHP Memcached 扩展 曙光博客2018-03-212 阅读 系统memcachedphp安装 默认情况下,Plesk的PHP是不带Memcached扩展的,需要我们自己安装。 安装环境: Plesk Onyx 17.5.3 + Cent...

曙光博客
2018/03/21
0
0
php7安装memcached扩展失败,提示缺少php_smart_string.h文件,请问应该如何解决?

如题,系统是centos 6.5,php7,memcache已安装,libmemcached也已安装完。在php官网下载了memcached的源码包,解压缩,执行phpize和./configure、make都没问题。 在执行make install的时候提...

路过暴风
2015/12/20
17.6K
2
CenOS下安装Memcache和PHP Memcache扩展

I.安装Memcahce 1. 安装依赖包libevent Memcache需要安装libevent,所以安装前可能需要执行 yum install libevent-devel 2.安装memcache 从http://memcached.org/下载最源码新版1.4.13 tar -x...

net ljx
2012/11/13
97
0
PHP memcache memcached的扩展的安装

memcache扩展,memcached扩展,memcached服务端,libmemcached扩展库 组合方式: memcache扩展 + memcached服务端 new Memcache(); 算是初代memcache技术 memcached扩展 + libmemcached扩展库...

big_cat
2015/07/22
479
0

没有更多内容

加载失败,请刷新页面

加载更多

MainThreadSupport

MainThreadSupport EventBus 3.0 中的代码片段. org.greenrobot.eventbus.MainThreadSupport 定义一个接口,并给出默认实现类. 调用者可以在EventBus的构建者中替换该实现. public interface ...

马湖村第九后羿
33分钟前
3
0
指定要使用的形状来代替文字的显示

控制手机键盘弹出的功能只能在ios上实现,安卓是实现不了的,所以安卓只能使用type类型来控制键盘类型,例如你要弹出数字键盘就使用type="number",如果要弹出电话键盘就使用type="tel",但这...

前端老手
43分钟前
5
0
总结:Raft协议

一、Raft协议是什么? 分布式一致性算法。即解决分布式系统中各个副本数据一致性问题。 二、Raft的日志广播过程 发送日志到所有Followers(Raft中将非Leader节点称为Follower)。 Followers收...

浮躁的码农
51分钟前
7
0
Flask-admin Model View字段介绍

Model View字段介绍 can_create = True 是否可以创建can_edit = True 是否可以编辑can_delete = True 是否可以删除list_template = 'admin/model/list.html' 修改显......

dillonxiao
今天
5
0
从AnnotationTransactionAspect开始rushSpring事务

0. Spring 事务 with LTW 0.1. Spring 事务 With LTW的原因: Pure Proxy-base mode有缺陷,其失效原因分析及使用方法及运行机制(LoadTimeWeaverBeanDefinitionParser和 AspectJWeavingEnable......

Aruforce
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部