[b][i]肖理达 (KrazyNio AT hotmail.com), 2006.04. 06, 转载请注明出处[/i][/b]
[b]一、memcached 简介[/b]
在很多场合,我们都会听到 [url=http://www.danga.com/memcached/]
memcached[/url] 这个名字,但很多同学只是听过,并没有用过或实际了解过,只知道它是一个很不错的东东。这里简单介绍一下,memcached 是高效、快速的分布式内存对象缓存系统,主要用于加速 WEB 动态应用程序。
[b]二、memcached 安装[/b]
首先是下载 memcached 了,目前最新版本是 1.1.12,直接从官方网站即可下载到 [url=http://www.danga.com/memcached/dist/memcached-1.1.12.tar.gz]
memcached-1.1.12.tar.gz[/url]。除此之外,memcached 用到了 [url=http://monkey.org/~provos/libevent/]
libevent[/url],我[url=http://monkey.org/~provos/libevent-1.1a.tar.gz]
下载的是 libevent-1.1a.tar.gz[/url]。
接下来是分别将 libevent-1.1a.tar.gz 和 memcached-1.1.12.tar.gz 解开包、编译、安装:
[url=http://www.php.net/manual/en/ref.memcache.php]memcache 的扩展[/url],Linux 下编译时需要带上 [i]–enable-memcache[=DIR][/i] 选项,Window 下则在 php.ini 中去掉 php_memcache.dll 前边的注释符,使其可用。
除此之外,还有一种方法,可以避开扩展、重新编译所带来的麻烦,那就是直接使用 [url=http://wikipedia.sourceforge.net/doc/memcached-client/_includes_memcached-client_php.html]php-memcached-client[/url]。
本文选用第二种方式,虽然效率会比扩展库稍差一些,但问题不大。
[b]四、PHP memcached 应用示例[/b]
首先 [url=http://www.nioxiao.com/wp-content/uploads/2006/04/memcached-client.zip]下载 memcached-client.php[/url],在下载了 memcached-client.php 之后,就可以通过这个文件中的类“memcached”对 memcached 服务进行操作了。其实代码调用非常简单,主要会用到的方法有 add()、get()、replace() 和 delete(),方法说明如下:
[code]add ($key, $val, $exp = 0)[/code]
往 memcached 中写入对象,$key 是对象的唯一标识符,$val 是写入的对象数据,$exp 为过期时间,单位为秒,默认为不限时间;
[code]get ($key)[/code]
从 memcached 中获取对象数据,通过对象的唯一标识符 $key 获取;
[code]replace ($key, $value, $exp=0)[/code]
使用 $value 替换 memcached 中标识符为 $key 的对象内容,参数与 add() 方法一样,只有 $key 对象存在的情况下才会起作用;
[code]delete ($key, $time = 0)[/code]
删除 memcached 中标识符为 $key 的对象,$time 为可选参数,表示删除之前需要等待多长时间。
下面是一段简单的测试代码,代码中对标识符为 'mykey' 的对象数据进行存取操作:
[url=http://www.nioxiao.com/sharing-php-session-data-between-servers/]《PHP 实现多服务器共享 SESSION 数据》[/url]文章,文中的 SESSION 是使用数据库保存的,在并发访问量大的时候,服务器的负载会很大,经常会超出 MySQL 最大连接数,利用 memcached,我们可以很好地解决这个问题,工作原理如下:
[list]
[*]用户访问网页时,查看 memcached 中是否有当前用户的 SESSION 数据,使用 session_id() 作为唯一标识符;如果数据存在,则直接返回,如果不存在,再进行数据库连接,获取 SESSION 数据,并将此数据保存到 memcached 中,供下次使用;
[/*][*]当前的 PHP 运行结束(或使用了 [url=http://php.liukang.com/manual/en/function.session-write-close.php]session_write_close()[/url])时,会调用 My_Sess::write() 方法,将数据写入数据库,这样的话,每次仍然会有数据库操作,对于这个方法,也需要进行优化。使用一个全局变量,记录用户进入页面时的 SESSION 数据,然后在 write() 方法内比较此数据与想要写入的 SESSION 数据是否相同,不同才进行数据库连接、写入数据库,同时将 memcached 中对应的对象删除,如果相同的话,则表示 SESSION 数据未改变,那么就可以不做任何操作,直接返回了;
[/*][*]那么用户 SESSION 过期时间怎么解决呢?记得 memcached 的 add() 方法有个过期时间参数 $exp 吗?把这个参数值设置成小于 SESSION 最大存活时间即可。另外别忘了给那些一直在线的用户延续 SESSION 时长,这个可以在 write() 方法中解决,通过判断时间,符合条件则更新数据库数据。 [/*][/list]
[b]五、相关资源[/b]
[list]
[*][url=http://www.danga.com/memcached/]memcached 官方网站[/url]
[/*][*][url=http://wikipedia.sourceforge.net/doc/memcached-client/_includes_memcached-client_php.html]PHP memcached client[/url]
[/*][*][url=http://www.nioxiao.com/wp-content/uploads/2006/04/memcached-client.zip]下载 memcached-client.php[/url] [/*][/list]