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] 选项:
- #tar vxzf memcache-3.0.6.tgz
- #cd memcache-3.0.6
- #/usr/local/php/bin/phpize
- #./configure –enable-memcache –with-php-config=/usr/local/php/bin/php-config –with-zlib-dir
- #make
- #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获得帮助
实例代码:
03 | require_once ( 'memcached-client.php' ); |
06 | 'servers' => array ( '127.0.0.1:11211' ), |
08 | 'compress_threshold' => 10240, |
12 | $mc = new memcached( $options ); |
17 | $mc ->add( $key1 , 'some random strings' ); |
18 | $mc ->add( $key2 , 'some random strings2' ); |
19 | $val = $mc ->get( $key1 ); |
24 | $val2 = $mc ->get_multi( $keys ); |
27 | echo "get_multi:\r\n" ; |
30 | $mc ->replace( $key1 , array ( 'some' => 'haha' , 'array' => 'xxx' )); |
31 | $val = $mc ->get( $key1 ); |
36 | $val = $mc ->get( $key1 ); |
在实际应用中,通常会把数据库查询的结果集保存到 memcached 中,下次访问时直接从 memcached 中获取,而不再做数据库查询操作,这样可以在很大程度上减轻数据库的负担。通常会将 SQL 语句 md5() 之后的值作为唯一标识符 key。下边是一个利用 memcached 来缓存数据库查询结果集的示例(此代码片段紧接上边的示例代码):
02 | $sql = 'SELECT * FROM users' ; |
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 )) |
13 | $mc ->add( $key , $datas ); |
15 | echo "n" . str_pad ( 'Read datas from memcached.' , 60, '_' ). "n" ; |
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" 。
<?php
session_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 中,持久化方面有所欠缺。