首页>>程序代码>>PHP中Memcache框架安装,配置和缓存使用
PHP中Memcache框架安装,配置和缓存使用
来源: 时间: 2015-05-07 19:44:36

Memcache是比较流行的cache解决方案,是高效、快速的分布式内存对象缓存系统,主要用于加速 WEB 动态应用程序

  memcached是运行在缓存服务器上的服务端程序名。

  memcache是memcache server的client端,有各种语言的版本,如:java、python、php等。(本文讲述php_memcache.dll的php模块安装 方式。)

  memcache不是必须和apache安装在同一台服务器,可以把memcache server看成是DB服务器,一台可以供多台使用;和apache安装在一起可以使资源充分使用,apache占用CPU多,内存相对较少,而 memcache占用CPU低,内存多。

  Memcache的安装分为两大块:

  memcache服务器端安装

  memcache客户端安装

  所谓服务器端的安装就是在服务器(一般都是linux系统)上安装Memcache实现数据的存储

  所谓客户端的安装就是指为php添加扩展,如PHP_memcache.dll,apache启动后使用服务器端的Memcache 提供的函数。

  Windows下的Memcache安装:

  1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached

  2. 在终端(也即cmd命令界面)下输入 ‘c:\memcached\memcached.exe -d install’ 安装

  3. 再输入: ‘c:\memcached\memcached.exe -d start’ 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。

  4.下载php_memcache.dll,请自己查找对应的php版本的文件,放在PHP的ext目录

  5. 在C:\winnt\php.ini 加入一行 ‘extension=php_memcache.dll’

  6.重新启动Apache,然后查看一下phpinfo,如果有memcache,那么就说明安装成功!

  测试代码

  $mem = new Memcache;

  $mem->connect("localhost", 11211);

  $mem->set('key', 'value', 0, 60);

  $val = $mem->get('key');

  echo $val;

  三、memcached常用方法介绍

  Memcache::connect() — 创建一个Memcache对象

  Memcache::pconnect() — 创建一个Memcache的持久连接对象

  Memcache::flush() — 清除所有缓存的数据,但是不会削去使用的内存空间。

  Memcache::close() — 关闭一个Memcache对象

  memcache_debug() — 控制调试功能,前提是php在编译的时候使用了–enable-debug选项,否则这个函数不会有作用。

  Memcache::addServer() — 添加一个可供使用的服务器地址。该方法有8个参数,除了第一个参数以外,其他都是可选的,第一个参数表示服务器的地址,第二个参数表示端口,第三个参数表 示是否是一个持久连接,第四个参数表示这台服务器在所有服务器中所占的权重,第五个参数表示连接的持续时间,第六个参数表示连接重试的间隔时间,默认为 15,设置为-1表示不进行重试,第七个参数用来控制服务器的在线状态,第8个参数允许设置一个回掉函数来处理错误信息。

  Memcache::add() — 添加一个值,如果已经存在,则返回false

  Memcache::set() — 添加一个值,如果已经存在,则覆写。 该方法有四个参数,第一个参数是key,第二个参数是value,第三个参数可选,表示是否压缩保存, 第四个参数可选,用来设置一个过期自动销毁的时间。

  Memcache::get() — 获取一个key值。该方法有一个参数,表示key

  Memcache::replace() — 对一个已有的key进行覆写操作。该方法有四个参数,作用和Memcache::set()方法的相同。

  Memcache::increment() — 对保存的某个key中的值进行加法操作

  Memcache::decrement() — 对保存的某个key中的值进行减法操作

  Memcache::delete() — 删除一个key值。该方法有两个参数,第一个参数表示key,第二个参数可选,表示删除延迟的时间。

  Memcache::getExtendedStats() — 获取进程池中所有进程的运行系统统计

  Memcache::getServerStatus() — 获取运行服务器的参数。两个参数分别表示的地址和端口

  Memcache::getStats() — 返回服务器的一些运行统计信息。此方法有三个参数,第一个参数表示要求返回的类型:reset, malloc, maps, cachedump, slabs, items, sizes;第二个参数和第三个参数是在第一个参数设置为“cachedump”时使用的。

  Memcache::getVersion() — 返回运行的Memcache的版本信息

  Memcache::setCompressThreshold() — 对大于某一大小的数据进行压缩。该方法有两个参数,第一个参数表示处理数据大小的临界点,第二个参数表示压缩的比例,默认为0.2。

  Memcache::setServerParams() — 在运行时修改服务器的参数。相对Memcache::addServer()方法少了第三和第四个参数

  说明:

  Memcache::add()方法的作用和Memcache::set()方法类似,区别是如果 Memcache::add方法的返回值为false,表示这个key已经存在,而Memcache::set方法则会直接覆写。

  四、php.ini中Memcache的配置

  [Memcache]

  ; 一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,

  ; 它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。

  ; 是否在遇到错误时透明地向其他服务器进行故障转移。

  memcache.allow_failover = On

  ; 接受和发送数据时最多尝试多少个服务器,只在打开memcache.allow_failover时有效。

  memcache.max_failover_attempts = 20

  ; 数据将按照此值设定的块大小进行转移。此值越小所需的额外网络传输越多。

  ; 如果发现无法解释的速度降低,可以尝试将此值增加到32768。

  memcache.chunk_size = 8192

  ; 连接到memcached服务器时使用的默认TCP端口。

  memcache.default_port = 11211

  ; 控制将key映射到server的策略。默认值"standard"表示使用先前版本的老hash策略。

  ; 设为"consistent"可以允许在连接池中添加/删除服务器时不必重新计算key与server之间的映射关系。

  ;memcache.hash_strategy = "standard"

  ; 控制将key映射到server的散列函数。默认值"crc32"使用CRC32算法,而"fnv"则表示使用FNV-1a算法。

  ; FNV-1a比CRC32速度稍低,但是散列效果更好。

  ;memcache.hash_function = "crc32"

  ;memcache也可以作为session的存储模块,具体参看:memcache PHP 的 session.save_handler.

  -p 监听的端口

  -l 连接的IP地址, 默认是本机

  -d start 启动memcached服务

  -d restart 重起memcached服务

  -d stop|shutdown 关闭正在运行的memcached服务

  -d install 安装memcached服务

  -d uninstall 卸载memcached服务

  -u 以的身份运行 (仅在以root运行的时候有效)

  -m 最大内存使用,单位MB。默认64MB

  -M 内存耗尽时返回错误,而不是删除项

  -c 最大同时连接数,默认是1024

  -f 块大小增长因子,默认是1.25

  -n 最小分配空间,key+value+flags默认是48

  -h 显示帮助

  项目主页:http://jehiah.cz/projects/memcached-win32/

  文档地址:

  下载地址:http://jehiah.cz/projects/memcached-win32/files /memcached-1.2.1-win32.zip

  http://downloads.php.net/pierre/选择适当版本的php_memcache,我的PHP是 5.3.x

  bool Memcache::connect ( string $host [, int $port [, int $timeout ]] )

  连接memcache服务器

  2.1.2.参数

  $host(string) 服务器域名或ip

  $port(int) 服务器tcp端口号,默认值是11211

  $timeout 连接memcache进程的失效时间,在修改它的默认值1的时候要三思,以免失去所有memcache缓存的优势导致连接变得很慢。

  2.1.3.返回值

  如果成功则返回true,失败则返回false

  2.1.4.范例

  <?php/* procedural API */$memcache_obj = memcache_connect('memcache_host', 11211);/* OO API */$memcache = new Memcache;$memcache->connect('memcache_host', 11211);?>

  2.4.Memcache::addServer

  2.4.1.说明

  bool Memcache::addServer ( string $host [, int $port [, bool $persistent [, int $weight [, int $timeout [, int $retry_interval [, bool $status [, callback $failure_callback ]]]]]]] )

  向对象添加一个服务器(注:addServer没有连接到服务器的动作,所以在memcache进程没有启动的时候,执行 addServer成功也会返回true)

  2.4.2.参数

  host 服务器域名或 IP

  port 端口号,默认为 11211

  persistent 是否使用常连接,默认为 TRUE

  weight 权重,在多个服务器设置中占的比重

  timeout 连接服务器失效的秒数,修改默认值 1 时要三思,有可能失去所有缓存方面的优势导致连接变得很慢

  retry_interval 服务器连接失败时的重试频率,默认是 15 秒一次,如果设置为 -1 将禁止自动重试,当扩展中加载了 dynamically via dl() 时,无论本参数还是常连接设置参数都会失效。

  每一个失败的服务器在失效前都有独自的生存期,选择后端请求时会被跳过而不服务于请求。一个过期的连接将成功的重新连接或者被标记为 失败的连接等待下一次重试。这种效果就是说每一个 web server 的子进程在服务于页面时的重试连接都跟他们自己的重试频率有关。

  status 控制服务器是否被标记为 online,设置这个参数为 FALSE 并设置 retry_interval 为 -1 可以使连接失败的服务器被放到一个描述不响应请求的服务器池子中,对这个服务器的请求将失败,接受设置为失败服务器的设置,默认参数为 TRUE,代表该服务器可以被定义为 online。

  failure_callback 失败时的回调函数,函数的两个参数为失败服务器的 hostname 和 port

  2.4.3.返回值

  成功返回 TRUE,失败返回 FALSE。

  注:在测试addServer函数的时候我们主要测试了其参数retry_interval和status

  2.4.4.范例

  2.4.4.1.retry_interval参数的测试

  <?php$mem = new Memcache;$is_add = $mem->addServer('localhost', 11211, true, 1, 1, 15, true); // retrt_interval=15$is_set = $mem->set('key1', '中华人民共和国');?>

  上面的例子中如果localhost服务器down掉或是memcache守护进程当掉,执行请求的时候连接服务器失败时算起15秒 后会自动重试连接服务器,但是在这15秒内不会去连接这个服务器,就是只要有请求,没15秒就会尝试连接服务器,但是每个服务器连接重试是独立的。比如说 我一次添加了两个服务器一个是localhost,一个是172.16.100.60,它们分别是从各自连接失败那个时间算起,只要对各自服务器有请求就 会每隔15秒去连接各自的服务器的。

  2.4.4.2.retry_interval和status结合使用的情况

  <?php$mem = new Memcache;$is_add = $mem->addServer('localhost', 11211, true, 1, 1, -1, false); // retrt_interval=-1, status=false$is_set = $mem->set('key1', '中华人民共和国');?>

  在上面的retrt_interval=-1, status=false这种情况下,将连接失败的服务器放到一个不响应请求的一个池子中,因此对key分配的算法也就没有影响了,而他是立即返回错误失 败还是故障转移还要看memcache.allow_failover的设置,执行set, add, replace,get等请求的时候都会失败返回false,即使memcache进程运行正常。

  2.4.4.3.status参数的测试

  除了与retry_interval结合使用,status单独使用的情况会对函数 memcache::getServerStatu获得的结果产生影响

  无论memcache进程的正常运行还是当掉,status为true的时候getServerStatus的结果都是true,反 之则为false

  但是在memcache进程正常运行的情况下,对set,add,replace,get等函数都没有影响。

  2.5.Memcache::add

  2.5.1.说明

  bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )

  添加一个要缓存的数据如果作为这个缓存的数据的键在服务器上还不存在的情况下,

  2.5.2.参数

  key 缓存数据的键 其长度不能超过250个字符

  var 值,整型将直接存储,其他类型将被序列化存储 ,其值最大为1M

  flag 是否使用 zlib 压缩 ,当flag=MEMCACHE_COMPRESSED的时侯,数据很小的时候不会采用zlib压缩,只有数据达到一定大小才对数据进行zlib压 缩。(没有具体的测试数据进行压缩的最小值是多少)

  expire 过期时间,0 为永不过期,可使用 unix 时间戳格式或距离当前时间的秒数,设为秒数时不能大于 2592000(30 天)

  2.5.3.返回值

  成功返回 TRUE,失败返回 FALSE,如果这个键已经存在,其他方面memcache:;add()的行为与memcache::set相似

  2.5.4.范例

  <?php$memcache_obj = memcache_connect("localhost", 11211);/* procedural API */memcache_add($memcache_obj, 'var_key', 'test variable', FALSE, 30);/* OO API */$memcache_obj->add('var_key', 'test variable', FALSE, 30);?>

  2.6.Memcache::replace

  2.6.1.说明

  bool Memcache::replace ( string $key , mixed $var [, int $flag [, int $expire ]] )

  替换一个指定 已存在key 的的缓存变量内容

  2.6.2.参数

  key 缓存数据的键, 其长度不能超过250个字符

  var 值,整型将直接存储,其他类型将被序列化存储,其值最大为1M

  flag 是否使用 zlib 压缩 ,当flag=MEMCACHE_COMPRESSED的时侯,数据很小的时候不会采用zlib压缩,只有数据达到一定大小才对数据进行zlib压 缩。(没有具体的测试数据进行压缩的最小值是多少)

  expire 过期时间,0 为永不过期,可使用 unix 时间戳格式或距离当前时间的秒数,设为秒数时不能大于 2592000(30 天)

  2.6.3.返回值

  成功返回 TRUE,失败返回 FALSE。

  2.6.4.范例

  <?php$memcache_obj = memcache_connect('memcache_host', 11211);/* procedural API */memcache_replace($memcache_obj, "test_key", "some variable", FALSE, 30);/* OO API */$memcache_obj->replace("test_key", "some variable", FALSE, 30);?>

  2.7.Memcache::set

  2.7.1.说明

  bool Memcache::set ( string $key , mixed $var [, int $flag [, int $expire ]] )

  设置一个指定 key 的缓存变量内容

  2.7.2.参数

  key 缓存数据的键, 其长度不能超过250个字符

  var 值,整型将直接存储,其他类型将被序列化存储,其值最大为1M

  flag 是否使用 zlib 压缩 ,当flag=MEMCACHE_COMPRESSED的时侯,数据很小的时候不会采用zlib压缩,只有数据达到一定大小才对数据进行zlib压 缩。(没有具体的测试数据进行压缩的最小值是多少)

  expire 过期时间,0 为永不过期,可使用 unix 时间戳格式或距离当前时间的秒数,设为秒数时不能大于 2592000(30 天)

  2.7.3.返回值

  成功返回 TRUE,失败返回 FALSE。

  2.7.4.范例

  <?php/* procedural API *//* connect to memcached server */$memcache_obj = memcache_connect('memcache_host', 11211);/*set value of item with key 'var_key'using 0 as flag value, compression is not usedexpire time is 30 second*/memcache_set($memcache_obj, 'var_key', 'some variable', 0, 30);echo memcache_get($memcache_obj, 'var_key');?><?php/* OO API */$memcache_obj = new Memcache;/* connect to memcached server */$memcache_obj->connect('memcache_host', 11211);/*set value of item with key 'var_key', using on-the-fly compressionexpire time is 50 seconds*/$memcache_obj->set('var_key', 'some really big variable', MEMCACHE_COMPRESSED, 50);echo $memcache_obj->get('var_key');?>

  2.8.Memcache::get

  2.8.1.说明

  string Memcache::get ( string $key [, int &$flags ] )

  array Memcache::get ( array $keys [, array &$flags ] )

  获取某个 key 的变量缓存值

  2.8.2.参数

  key 缓存值的键

  flags 如果是传址某个变量,获取缓存值被set或是add的flag结果将被存于该变量

  2.8.3.返回值

  返回缓存的指定 key 的变量内容或者是在失败或该变量的值不存在时返回 FALSE

  如果传出的key的数组中的key都不存在,返回的结果是一个空数组,反之则返回key与缓存值相关联的关联数组

  2.8.4.范例

  <?php/* procedural API */$memcache_obj = memcache_connect('memcache_host', 11211);$var = memcache_get($memcache_obj, 'some_key');/* OO API */$memcache_obj = new Memcache;$memcache_obj->connect('memcache_host', 11211);$var = $memcache_obj->get('some_key');/*You also can use array of keys as a parameter.If such item wasn't found at the server, the resultarray simply will not include such key.*//* procedural API */$memcache_obj = memcache_connect('memcache_host', 11211);$var = memcache_get($memcache_obj, Array('some_key', 'another_key'));//如果some_key,another_key不存在 $var = array();//如果some_key,another_key存在 $var = array('some_key'=>'缓存值', 'another_key'=>'缓存值');/* OO API */$memcache_obj = new Memcache;$memcache_obj->connect('memcache_host', 11211);$var = $memcache_obj->get(Array('some_key', 'second_key'));?>

  2.9.Memcache::delete

  2.9.1.说明

  bool Memcache::delete ( string $key [, int $timeout ] )

  删除某一个变量的缓存

  2.9.2.参数

  key 缓存的键 键值不能为null和'’,当它等于前面两个值的时候php会有警告错误。

  timeout 删除这项的时间,如果它等于0,这项将被立刻删除反之如果它等于30秒,那么这项被删除在30秒内

  2.9.3.返回值

  成功返回 TRUE,失败返回 FALSE。

  2.9.4.范例

  <?php/* procedural API */$memcache_obj = memcache_connect('memcache_host', 11211);/* after 10 seconds item will be deleted by the server */memcache_delete($memcache_obj, 'key_to_delete', 10);/* OO API */$memcache_obj = new Memcache;$memcache_obj->connect('memcache_host', 11211);$memcache_obj->delete('key_to_delete', 10);?>

  2.10.Memcache::flush

  2.10.1.说明

  bool Memcache::flush ( void )

  清空所有缓存内容,不是真的删除缓存的内容,只是使所有变量的缓存过期,使内存中的内容被重写

  2.10.2.返回值

  成功返回 TRUE,失败返回 FALSE。

  2.10.3.范例

  <?php/* procedural API */$memcache_obj = memcache_connect('memcache_host', 11211);memcache_flush($memcache_obj);/* OO API */$memcache_obj = new Memcache;$memcache_obj->connect('memcache_host', 11211);$memcache_obj->flush();?>

  2.11.Memcache::getExtendedStats

  2.11.1.说明

  array Memcache::getExtendedStats ([ string $type [, int $slabid [, int $limit ]]] )

  获取所有服务器扩展静态信息

  2.11.2.参数

  type 静态信息类型,有效值包括{reset, malloc, maps, cachedump, slabs, items, sizes},依照一定规则协议这个可选参数是为了方便开发人员查看不同类别的信息而输入的标题

  slabid 用于按指定类型联合设置 cache 堆为有效的片到堆中。缓存堆被被命令绑定到服务器上并被严格的用于调试用途

  limit 用于按指定类型联合设置 cache 堆为输入的数字所限制的大小到堆,默认值为 100

  2.11.3.返回值

  返回一个由服务器扩展静态信息二维数组,失败时返回 FALSE

  2.11.4.范例

  <?php$memcache_obj = new Memcache;$memcache_obj->addServer('memcache_host', 11211);$memcache_obj->addServer('failed_host', 11211);$stats = $memcache_obj->getExtendedStats(); print_r($stats);?>

本页地址:http://www.easytd.com/chengxudaima/d_15050719776.html

网友评论留言

验证码 换一张
上一篇:PHP读取文件内容的正确方法 下一篇:Struts2 如何获取Request,Session对象?