肖利达(hotmail.com上的krazynio),2006年4月6日,请注明出处。1.memcached简介。在很多场合,我们都会听到memcached这个名字,但是很多同学只听说过,却从来没有用过或者实际了解过,只知道它是一个非常好的东西。简而言之,memcached是一个高效快速的分布式内存对象缓存系统,主要用于加速WEB动态应用。二、memcached的安装从下载memcached开始,最新版本是1.1.12,可以直接从官网下载到memcached-1.1.12.tar.gz。此外,memcached使用了libevent,我下载了libevent-1.1a.tar.gz。接下来,分别对libevent-1.1a.tar.gz和memcached-1.1.12.tar.gz进行解包、编译和安装:复制的代码如下: # tar-xzf libevent-1.1a.tar.gz # cdlibevent-1.1a #。/configure-prefix=/usr # make # make install # CD.# tar-xzf memcached-1.1.12.tar.gz # CD memcached-1 . 1 . 12 #。/configure-prefix=/usr # make # Memcached应该在make install安装后的/usr/bin/memcached中。三、运行memcached daemon运行memcached daemon非常简单,只需要一个命令行,不需要修改任何配置文件(也没有配置文件供你修改):/usr/bin/memcached-d-m128-l 192 . 168 . 1 . 1-p 11211-u httpd参数说明:-d作为守护进程。-m设置memcached可以在m中使用的内存大小;-l设置要收听的IP地址。如果是本地机,这个参数通常不能设置;-p设置监听端口,默认为11211,所以可以不设置该参数;-u指定用户。如果它当前是根用户,则需要使用此参数来指定用户。当然,还有其他可以使用的参数,man memcached可以看到。memcached的工作原理首先,memcached作为守护进程运行在一台或多台服务器上,随时接受客户端的连接操作。客户端可以用各种语言编写。目前已知的客户端API包括Perl/PHP/Python/Ruby/Java/C#/C等。PHP客户端与memcached服务建立连接后,接下来要做的就是访问对象。每个被访问的对象都有一个唯一的标识符键,访问操作通过这个键来执行。保存在memcached中的对象实际上是放在内存中,而不是缓存文件中,这就是memcached如此高效和快速的原因。请注意,这些对象不是持久的,在服务停止后,其中的数据将会丢失。
3.PHP如何充当memcached客户端有两种方法可以让PHP充当memcached客户端,并调用memcached服务来访问对象。首先,PHP有一个名为memcache的扩展。在Linux下编译时,需要带enable-memcache[=dir]的选项,而在Window下,可以从php.ini中去掉php_memcache.dll前面的注释,使其可用。此外,还有一种方法可以避免扩展和重新编译带来的麻烦,那就是直接使用php-memcached-client。本文选择了第二种方法,虽然效率会比扩展库略差,但问题不大。第四,PHP memcached应用示例首先下载memcached-client.php,下载memcached-client.php之后,可以通过这个文件中的类“memcached”来操作memcached服务。实际上,代码调用非常简单,使用的主要方法是add()、get()、replace()和delete()。方法描述如下:add ($key,$val,$exp=0)将对象写入memcached,其中$key是对象的唯一标识符,$val是写入的对象数据,$exp是以秒为单位的过期时间。Get ($key)通过对象的唯一标识符$key从memcached获取对象数据;Replace ($key,$value,$exp=0)将memcached中标识符为$key的对象内容替换为$value。参数与add()方法相同,只有在$key对象存在的情况下才有效;Delete ($key,$time=0)删除memcached中标识符为$key的对象。$time是一个可选参数,指示删除前要等待多长时间。下面是一个简单的测试代码,其中访问了标识符为‘my key’的对象数据:复制代码如下:Php //包含memcached类文件require _ once(' memcached-client . PHP ');//option set $ options=array(' servers '=array(' 192 . 168 . 1 . 1:11211 '),//memcached服务的地址和端口,多个数组元素可以用来表示多个memcached服务' debug'=true。//是否打开debug ' compress _ threshold '=10240,//应该压缩多少字节的数据' persistent '=false//是否使用persistent connection);//创建memcached对象实例$ MC=new memcached($ options);//设置此脚本使用的唯一标识符$ key=' mykey//将对象$ MC-add ($ key,'一些随机字符串')写入memcached$ val=$ MC-get($ key);回声n。str_pad('$mc-add()',60,' _ ')。n ';var _ dump($ val);//替换写入的对象数据值$ MC-replace ($ key,array ('some'=' haha ',' array '=' XXX '));$ val=$ MC-get($ key);回声n。str_pad('$mc-replace()',60,' _ ')。n ';var _ dump($ val);//删除memcached中的对象$ MC-delete($ key);$ val=$ MC-get($ key);回声n。str_pad('$mc-delete()',60,' _ ')。n ';var _ dump($ val);不是很简单吗?在实际应用中,数据库查询的结果集通常保存在memcached中,并在下次访问时直接从memcached中获取,而不是进行数据库查询操作,可以大大减轻数据库的负担。SQL语句md5()后的值通常用作唯一标识符密钥。下面是一个使用memcached缓存数据库查询结果集的例子(这个代码片段后面紧跟着上一节的示例代码):复制代码如下:php $ sql=' SELECT * FROM users$ key=MD5($ SQL);//memcached对象标识符if(!($ data=$ MC-get($ key)){//如果在memcached中没有获得缓存的数据,使用数据库查询获得记录集。回声n。str_pad('从MySQL读取数据', 60, '_').n ';$conn=mysql_connect('localhost ',' test ',' test ');MySQL _ select _ db(' test ');$ result=MySQL _ query($ SQL);while($ row=MySQL _ fetch _ object($ result))$ datas[]=$ row;//将从数据库获得的结果集数据保存到memcached,以备下次访问。$mc-add($key,$ datas);} else { echo ' n。str_pad('从memcached读取数据', 60, '_').n ';} var _ dump($ datas);可以看出,使用memcached后,可以减少数据库连接和查询操作,降低数据库负载,脚本运行速度也有所提高。
我曾经写过一篇名为《PHP 实现多服务器共享 SESSION 数据》的文章,里面的SESSION是用数据库保存的。当并发访问次数较多时,服务器的负载会很重,往往会超过MySQL的最大连接数。有了memcached,我们可以很好地解决这个问题。工作原理如下:用户访问网页时,检查memcached中是否有当前用户的SESSION数据,并使用session_id()作为唯一标识符;如果数据存在,直接返回;如果它不存在,它将连接到数据库以获取SESSION数据,这些数据将保存在memcached中供下次使用。当前PHP运行完毕(或者使用session_write_close()时,会调用My_Sess:write()方法将数据写入数据库,这样每次还是会有数据库操作,这个方法需要优化。当用户进入页面时,使用全局变量记录SESSION数据,然后比较该数据是否与write()方法中要写入的SESSION数据相同。如果不同,建立数据库连接并写入数据库,同时删除memcached中对应的对象。如果相同,则表示SESSION数据没有变化,因此可以直接返回,无需任何操作。那么如何解决用户SESSION的过期时间呢?还记得memcached的add()方法有一个过期时间参数$exp吗?将此参数值设置为小于SESSION的最大存活时间。此外,不要忘记延长那些总是在线的用户的会话持续时间,这可以通过write()方法来解决。通过判断时间,如果满足条件,数据库数据将被更新。相关资源memcached官网PHP memcached客户端下载memcached-client.php。