PHP+memcache安装使用例子

来源:互联网 发布:php iterator接口 编辑:程序博客网 时间:2024/05/01 22:02

memcached 是高效、快速的分布式内存对象缓存系统,主要用于加速 WEB 动态应用程序,以守护程序方式运

行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API

包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 服务建立连接之后,接下来的

事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到

memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能

够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。

有两种方法可以使 PHP 作为 memcached 客户端,调用 memcached 的服务进行对象存取操作。 第一种,

PHP 有一个叫做 memcache 的扩展,在PHP中配置好拓展可以使用PHP提供的memcache函数来操作

memcache,Linux 下编译时需要带上 –enable-memcache[=DIR] 选项:

  1. #tar vxzf memcache-3.0.6.tgz  
  2. #cd memcache-3.0.6  
  3. #/usr/local/php/bin/phpize  
  4. #./configure –enable-memcache –with-php-config=/usr/local/php/bin/php-config –with-zlib-dir  
  5. #make  
  6. #make install 

Window 下则在 php.ini 中去掉 php_memcache.dll 前边的注释符,使其可用。 除此之外,还有一种方法,可

以避开扩展、重新编译所带来的麻烦,那就是直接使用memcached-client.zip。一般推荐使用第二种方式,只要

在PHP中includememcache-client.php就可以使用这个类提供的函数来操作mecache,虽然效率会比扩展库稍

差一些,但问题不大。windows下的php_memcache.dll在http://downloads.php.net/pierre/这里下载相应版本,

放入ext文件夹,然后在ini中开启即可。

windows下安装memcached服务:

详细过程移步这里:http://www.cnblogs.com/wucg/archive/2011/03/01/1968185.html

ubuntu下安装memcached 服务 :

sudo apt-get install memcached

运行memcached守护进程:

/usr/local/bin/memcached -d -m 100 -u root -l 127.0.0.1 -p 11211 -c 256 -P tmp/memcached.pid  

参数说明:/usr/local/bin/memcached 是memcached编译后所在的地址 -d 是一个守护进程占用一个进程, -m 是

分配给memcached的内存,单位MB, -u 是启动memcached的用户, -l 是监听的服务器地址,这里可以设置多台

memcache服务器监听同一个IP作成集群, -p 是端口号,默认是11211,实际企业生产中建议修改, -c是运行时最大

的并发连接数,默认1024, -P是设置保存memcached的pid文件. 其他参数可以用memcached -h获得帮助

实例代码:

01<?php
02//   包含 memcached 类文件
03require_once('memcached-client.php');
04//   选项设置
05$options array(
06     'servers' => array('127.0.0.1:11211'), //memcached 服务的地址、端口,可用多个数组元素表示多个 memcached 服务
07     'debug' => true,   //是否打开 debug
08     'compress_threshold' => 10240,   //超过多少字节的数据时进行压缩
09     'persistant' => false   //是否使用持久连接
10     );
11//   创建 memcached 对象实例
12$mc new memcached($options);
13//   设置此脚本使用的唯一标识符
14$key1 'mykey';
15$key2 'mykey2';
16//   往 memcached 中写入对象
17$mc->add($key1'some random strings');
18$mc->add($key2'some random strings2');
19$val $mc->get($key1);
20$keys array(
21'mykey',
22'mykey2',
23);
24$val2 $mc->get_multi($keys);//以数组中的键值获取一个数组的数据
25//echo "n".str_pad('$mc->add() ', 60, '_')."n";
26var_dump($val);
27echo "get_multi:\r\n";
28var_dump($val2);
29//   替换已写入的对象数据值
30$mc->replace($key1array('some'=>'haha''array'=>'xxx'));
31$val $mc->get($key1);
32//echo "n".str_pad('$mc->replace() ', 60, '_')."n";
33var_dump($val);
34//   删除 memcached 中的对象
35$mc->delete($key1);
36$val $mc->get($key1);
37//echo "n".str_pad('$mc->delete() ', 60, '_')."n";
38var_dump($val);
39?>

在实际应用中,通常会把数据库查询的结果集保存到 memcached 中,下次访问时直接从 memcached 中获取,而不再做数据库查询操作,这样可以在很大程度上减轻数据库的负担。通常会将 SQL 语句 md5() 之后的值作为唯一标识符 key。下边是一个利用 memcached 来缓存数据库查询结果集的示例(此代码片段紧接上边的示例代码):

1 
01<?php
02$sql 'SELECT * FROM users';
03$key = md5($sql);   //memcached 对象标识符
04{
05     //   在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。
06     echo "n".str_pad('Read datas from MySQL.', 60, '_')."n";
07     $conn = mysql_connect('localhost''test''test');
08     mysql_select_db('test');
09     $result = mysql_query($sql);
10     while ($row = mysql_fetch_object($result))
11         $datas[] = $row;
12     //   将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。
13     $mc->add($key$datas);
14{
15     echo "n".str_pad('Read datas from memcached.', 60, '_')."n";
16}
17var_dump($datas);
18?>

Memcache还可以用来存储session: 将php.ini中改为:

session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"

使用多个 memcached server 时用逗号","隔开,并且和 Memcache::addServer() 文档中说明的一样,
可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval" 等等,类似这样的:
"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2" 。

<?phpsession_start();$_SESSION["UserID"]=123;echo session_id();?>

用 sessionid 去 memcached 里查询一下:

<?php$memcache = memcache_connect('localhost', 11211);var_dump($memcache->get('19216821213cxycedec65b0883238c278eeb573e077'));?>

用 memcache 来存储 session 在读写速度上会比 files 时快很多,而且在多个服务器需要共用 session

时会比较方便,将这些服务器都配置成使用同一组 memcached 服务器就可以,减少了额外的工作量。

缺点是 session 数据都保存在 memory 中,持久化方面有所欠缺。