安装PHP的memcache扩展之前,要先编译安装一套LA/NMP,且下面这一步/usr/local/php/bin/phpize要使用编译安装的PHP的phpize程序,用来生成configure文件。
一、安装PHP的memcache扩展功能
1)安装PHP的memcache扩展
1 2 3 4 5 |
[root@localhost ~]# tar xvf memcache-2.2.5.tgz [root@localhost ~]# cd memcache-2.2.5 [root@localhost memcache-2.2.7]# /usr/local/php/bin/phpize [root@localhost memcache-2.2.7]#./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache [root@localhost memcache-2.2.7]# make && make install |
上述安装完后会有类似以下的提示:
1 |
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-zts-20121212/ |
2)在php的主配置文件的“动态模块”相关位置添加如下一行来载入memcache扩展
1 2 |
[root@localhost ~]# vi /etc/php.ini extension=/usr/local/php/lib/php/extensions/no-debug-zts-20121212/memcache.so |
二、测试PHP的memcache扩展功能
1)建立一个phpinfo()
1 2 3 4 |
[root@localhost ~]# vi /usr/local/httpd/htdocs/index.php <?php phpinfo(); ?> |
访问phpinfo(),在浏览器中输入服务器的IP地址,可以看到php已经支持memcache了。
http://192.168.60.10/index.php
2)对memcached功能进行测试,在网站目录中建立测试页面test.php
1 2 3 4 5 6 7 8 9 10 11 12 |
[root@localhost ~]# vi /usr/local/httpd/htdocs/test.php <?php $mem = new Memcache; $mem->connect("127.0.0.1", 11211) or die("Could not connect"); $version = $mem->getVersion(); echo "Server's version: ".$version."<br/>\n"; $mem->set('testkey', 'Hello World', 0, 600) or die("Failed to save data at the memcached server"); echo "Store data in the cache (data will expire in 600 seconds)<br/>\n"; $get_result = $mem->get('testkey'); echo "$get_result is from memcached server."; $mem->set(‘num’,1,0); ?> |
这个test.php文件就是连接memcache并插入一个testkey,如果插入成功则返回成功字符串,如果插入失败则返回失败字符串。我们可以访问test.php,在浏览器中输入http://192.168.60.10/test.php,如果插入成功则返回以下字符串:
1 2 3 |
Server's version: 1.4.25 Store data in the cache (data will expire in 600 seconds) Hello World is from memcached server. |
然后可以连接到memcache服务器,获取testkey的值。
1 2 3 4 5 6 7 8 |
[root@localhost ~]# telnet 127.0.0.1 11211 get testkey VALUE testkey 0 11 Hello World END get number 1 END |
在test.php中,最后我设置了一个key,$mem->set(‘num’,1,0);,值等于1并且永不过期。那么接下来我又添加了一个countpage.php,就是用memcache的自增长功能,页面刷新一下就number的值就加1。
1 2 3 4 5 6 7 |
[root@localhost ~]# vi /usr/local/httpd/htdocs/countpage.php <?php $mem = new Memcache; $mem->connect("127.0.0.1", 11211); $mem->increment('number',1); echo $mem->get('number'); ?> |
执行完test.php页之后,number的值也就生效了,然后你可以尝试不停地刷新countpage.php页,页面显示的数值会一直加1。
三、Memcached缓存MySQL数据实例
使用Memcached缓存MySQL查询结果减轻数据库压力,下面直接上代码,后面做简单说明。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
[root@localhost ~]# vi /usr/local/httpd/htdocs/mysql.php <?php $mem = new Memcache; $mem->connect("127.0.0.1", 11211) or die("Could not connect"); $version = $mem->getVersion(); echo "Memcache's version: ".$version."<br/>\n"; $sql = sprintf('SELECT count(*) FROM user'); $key = md5($sql); //memcached 对象标识符 if ( !($datas = $mem->get($key)) ) { //在memcached中未获取到缓存数据,则使用数据库查询获取记录集。 echo "n".str_pad('Read datas from MySQL.', 60, '_')."n"; //连接MySQL数据库,用户密码自行填写 $conn = mysql_connect('localhost', 'root', 'redhat'); //选择mysql库 mysql_select_db('mysql'); $result = mysql_query($sql); while ($row = mysql_fetch_object($result)) $datas[] = $row; //将数据库中获取到的结果集数据保存到memcached中,以供下次访问时使用。 $mem->add($key, $datas,0); } else { echo "n".str_pad('Read datas from memcached.', 60, '_')."n"; } var_dump($datas); ?> |
说明:首先通过md5()将SQL语句转化成一个唯一的KEY,并用此KEY查询Memcached检测是否已经缓存,是的话在直接返回结果,否则先查询数据库再缓存,并返回结果。这样,下次使用此KEY就可以直接返回结果了。
然后第一次访问http://192.168.60.10/mysql.php,会出现如下内容:
1 2 |
Memcache's version: 1.4.25 nRead datas from MySQL. |
但第二次访问http://192.168.60.10/mysql.php,会出现如下内容:
1 2 |
Memcache's version: 1.4.25 nRead datas from memcached. |
然后你还可以通过telnet查看memcache的命中率,每一次刷新网页,get_hits就会加1.
1 2 3 4 |
[root@localhost ~]# telnet 127.0.0.1 11211 stats STAT get_hits 3 STAT get_misses 1 |
四、保存PHP Session到memcached
用 memcache 来存储 session 在读写速度上会比 files 时快很多,而且在多个服务器需要共用 session 时会比较方便(LVS轮询时使用所有客户端的共享session会话),将这些服务器都配置成使用同一组 memcached 服务器就可以,减少了额外的工作量。缺点是 session 数据都保存在 memory 中,持久化方面有所欠缺,但对 session 数据来说也不是很大的问题。
编辑PHP的主配置文件(PHP的session默认保存在文件中改为memcached)
1 2 3 4 |
[root@localhost ~]# vi /etc/php.ini #session.save_handler = files session.save_handler = memcache session.save_path = "tcp://192.168.60.10:11211?persistent=1&weight=1&timeout=1&retry_interval=15" |
新建php页面session.php,为客户端设置启用session
1 2 3 4 5 6 7 8 9 10 |
[root@localhost ~]# vi /usr/local/httpd/htdocs/session.php <?php session_start(); if(!isset($_SESSION['test'])) { $_SESSION['test'] = time(); } print$_SESSION['test']; print"<br><br>"; print"Session ID: " . session_id(); ?> |
新建php页面show.php,获取当前用户的session ID:
1 2 3 4 5 6 7 8 9 |
[root@localhost ~]# vi /usr/local/httpd/htdocs/show.php <?php session_start(); $mem = new Memcache; $mem->connect('127.0.0.1', 11211); $mysess=session_id(); var_dump($mem->get($mysess)); $mem->close(); ?> |
五、Libmemcached
访问memcached的传统方法是使用基于perl语言开发的Cache::memcached模块,这个模块在大多数perl代码中都能良好的工作,但也有着众所周知的性能方面的问题。libMemcached则是基于C语言开发的开源的C/C++代码访问memcached的库文件,同时,它还提供了数个可以远程使用的memcached管理工具,如memcat, memping,memstat,memslap等
编译安装libmemcached
1 2 3 4 5 |
[root@localhost ~]# tar xf libmemcached-1.0.2.tar.gz [root@localhost ~]# cd libmemcached-1.0.2 [root@localhost libmemcached-1.0.2]#./configure [root@localhost libmemcached-1.0.2]# make && make install [root@localhost libmemcached-1.0.2]# ldconfig |
客户端工具
1 2 3 4 |
[root@localhost ~]# memcat --servers=127.0.0.1:11211 mykey [root@localhost ~]# memping [root@localhost ~]# memslap [root@localhost ~]# memstat |
六、Nginx整合memcached
让Nginx使用memcached的缓存功能[URI:data]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
server { listen 80; server_name www.ywnds.com; #charset koi8-r; #access_log logs/host.access.log main; location / { set $memcached_key $uri; memcached_pass 127.0.0.1:11211; default_type text/html; error_page 404 @fallback; } location @fallback { proxy_pass http://172.16.0.1; } } |