2013年2月17日星期日
在Ubuntu上安装并C++使用libmemcached
最近要用C++开发项目需要操作memcached,查找到libmemcached是专门为C/C++提供的memcached客户端决定用它。
1. 在命令行下: wget https://launchpad.net/libmemcached/1.0/1.0.7/+download/libmemcached-1.0.7.tar.gz 下载文件。
2. 输入:sudo apt-get install libevent-dev 安装libevent-dev (据说这个很重要,不然libmemcached就不能运行,最好安装)
3. 解压缩下载文件:sudu tar -zxvf libmemcached-1.0.7.tar.gz
4. 编译: ./configure
5. 输入:make
这里很可能会出下面错误:
libmemcached/backtrace.cc: In function 'void custom_backtrace()':
libmemcached/backtrace.cc:57:6: sorry, unimplemented: Graphite loop optimizations can only be used if the libcloog-ppl0 package is installed
解决办法是修改Makefile,查找并去掉 floop-parallelize-all(应该有两处需要去掉),看了网上资料说是去掉后表示不使用Graphite loop 优化。
成功编译。
6. 安装:make install
7. 编写文件 MemCachedClient.h 输入下面内容:
#ifndef MEMCACHEDCLIENT
#define MEMCACHEDCLIENT
#include <libmemcached/memcached.h>
#include<iostream>
#include<string>
#include<time.h>
using std::string;
using std::cout;
using std::endl;
class MemCachedClient
{
public:
~MemCachedClient()
{
memcached_free(memc);
};
MemCachedClient()
{
memcached_return rc;
memcached_server_st *server = NULL;
memc = memcached_create(NULL);
server =memcached_server_list_append(server, "192.168.45.144", 11211, &rc);
rc=memcached_server_push(memc,server);
if (MEMCACHED_SUCCESS != rc)
{
cout <<"memcached_server_push failed! rc: " << rc << endl;
}
memcached_server_list_free(server);
};
int Insert(const char* key, const char* value,time_t expiration = 3)
{
if (NULL == key || NULL == value)
{
return -1;
}
uint32_t flags = 0;
memcached_return rc;
rc = memcached_set(memc, key, strlen(key),value, strlen(value), expiration, flags);
// insert ok
if (MEMCACHED_SUCCESS == rc)
{
return 1;
}
else
{
return 0;
}
};
string Get(const char* key)
{
if (NULL == key)
{
return "";
}
uint32_t flags = 0;
memcached_return rc;
size_t value_length;
char* value = memcached_get(memc, key, strlen(key), &value_length, &flags, &rc);
// get ok
if(rc == MEMCACHED_SUCCESS)
{
return value;
}
return "";
};
private:
memcached_st* memc;
};
#endif
再编写 test.cc 文件
#include<iostream>
#include"MemCachedClient.h"
using std::cout;
using std::endl;
int main()
{
MemCachedClient mc;
mc.Insert("kingcat","value123");
cout << mc.Get("kingcat") << endl;
return 1;
};
8. 用g++编译: g++ test.cc -o test -lmemcached (一定别把库链接忘了否则编译不通过)
9. 执行./test
执行时会报错:libmemcached.so.10: cannot open shared object file: No such file or director
原因是 libmemcached.so.10 被安装到了 /usr/local/lib下,而共享库默认位置是 /usr/lib 网上说可以把目录 /usr/local/lib 设置到环境变量,但我设置完后不起作用。
于是用建立一个链接: ln /usr/local/lib/libmemcached.so.10 /usr/lib/libmemcached.so.10
重新执行,顺利通过!
使用libmemcached提速memcached的操作
memcachedCacheRailsRubyGoogle
libmemcached是一个基于C/C++实现的memcached client library,memcached gem给这个library提供了ruby封装,根据原作者的性能评测,它比目前常用的memcache-client gem最多要快150倍。
因为对memcache的操作在rails处理整个http请求中所占时间比例并不多,而且JavaEye网站大部分是做cache读取操作,于是做了2个试验测试一下2者对于提升整个网站的性能到底有多少帮助:
1. 测试访问JavaEye网站的首页,在这个请求中只有一个缓存读取操作,使用ab简单地跑单次请求10000次:
使用memcache-client,平均完成每个请求是9.247 ms
使用memcached,平均完成每个请求是8.982 ms
对于整体性能提升在3%左右
2. 测试访问某个论坛版面的页面,整个请求有超过60次的缓存读取操作,使用ab简单跑单次请求1000次:
使用memcache-client,平均完成每个请求是95.872 ms
使用memcached,平均完成每个请求是91.591 ms
对于整体性能提升在5%左右
从试验可以看出,对于整体性能还是有一定提高的。JavaEye用的cache插件是cache_fu,它只支持memcache-client,不过通过简单的修改就可以支持这个新gem,我提交了一个补丁,有兴趣的话可以从这里下载到补丁。
--分割线--
cache_fu的作者已经将这个补丁添加到代码树,可以从github checkout: http://github.com/defunkt/cache_fu/tree/master
libmemcached使用(c 客户端连接 memcached) 2011-07-14 15:07:13
libmemcached 下载地址。https://launchpad.net/libmemcached/
//g++ -o testmemcached testmemcached.cpp -lmemcached
#include <iostream>
#include <string>
#include <libmemcached/memcached.h>
using namespace std;
int main(int argc,char *argv[])
{
//connect server
memcached_st *memc;
memcached_return rc;
memcached_server_st *server;
time_t expiration;
uint32_t flags;
memc = memcached_create(NULL);
server = memcached_server_list_append(NULL,"localhost",11211,&rc);
rc=memcached_server_push(memc,server);
memcached_server_list_free(server);
string key = "key";
string value = "value";
size_t value_length = value.length();
size_t key_length = key.length();
//Save data
rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
if(rc==MEMCACHED_SUCCESS)
{
cout<<"Save data:"<<value<<" sucessful!"<<endl;
}
//Get data
char* result = memcached_get(memc,key.c_str(),key_length,&value_length,&flags,&rc);
if(rc == MEMCACHED_SUCCESS)
{
cout<<"Get value:"<<result<<" sucessful!"<<endl;
}
//Delete data
rc=memcached_delete(memc,key.c_str(),key_length,expiration);
if(rc==MEMCACHED_SUCCESS)
{
cout<<"Delete key:"<<key<<" sucessful!"<<endl;
}
//free
memcached_free(memc);
return 0;
}
在下载客户端 libmemcached-0.50/tests 下有测试列子,也可参考。比如cpp_example.cc
memcached简单的使用教程
这是工程应用性质的文章:memcached是数据快速存取的工具,wikipedia和facebook就用了它提高速度。具体情况可以wiki.
c/c++里面使用memcached本来是很简单的事情,但就是没有人说,非要我去读libmemcache的实例代码才行,manpage也没有说清楚(但还不得不看)。如果要使用memcached,步骤如下:
1 安装memcached
你可以去官网 上下载,也可以sudo apt-get install memcached
2 测试你刚才的安装,
比如运行 memcached -d -m 64 -l 127.0.0.1 -p 12300
-d表示后台, -m 64表示使用64MB内存,-l 127.0.0.1 -p 12300 表示监听127.0.0.1:12300端口
没有任何消息就是运行成功
3 安装libmemcached
这个就不要apt了,因为没有精确的libmemcached包,乖乖去官网 下载吧。这个东西还需要libevent,这个没法apt,libevent安装的时候最好装到/usr/lib里面,不然libmemcached还不能运行。
4 测试libmemcached
找一个文件比如test,然后运行memcp test --servers=127.0.0.1:12300
这样就把test拷贝到memcached管理的内存里面了。
memcat test --servers=127.0.0.1:12300
看看是不是刚才的那个文件。
该装的全装了,我们可以改代码了。
(以下引自:wikipedia)
将纯粹使用数据库查询的程式码加上memcached支援是很简单的,假设这是原来的程式码:
function get_foo (int userid) {
result = db_select("SELECT * FROM users WHERE userid = ?", userid);
return result;
}
加上memcached的快取机制后:
function get_foo (int userid) {
result = memcached_fetch("userrow:" + userid);
if (!result) {
result = db_select("SELECT * FROM users WHERE userid = ?", userid);
memcached_add("userrow:" + userid, result);
}
return result;
}
(wikipedia 引述完毕)
但我们需要初始化,而且需要c/c++的表述形式:
首先修改makefile,在LIBS里面加上-lmemcached,比如原来 gcc test.c,现在 gcc test.c -lmemcached。这个库就是libmemcached提供的。
然后添加#include<libmemcached/memcached.h>,这个文件也是libmemcached提供的。
主函数里面需要添加:
memcached_st *memc;
uint32_t flags;
memcached_return rc;
memcached_server_st *servers;
memc= memcached_create(NULL);
servers= memcached_servers_parse("127.0.0.1:12300");
memcached_server_push(memc, servers);
memcached_server_list_free(servers);
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 0);
这就是初始化的全部代码,可以设置很多东西,不过我现在只要一个服务器,就看一句话:
servers= memcached_servers_parse("127.0.0.1:12300");
这就是指明要连接到位于127.0.0.1监听12300端口的memcached程序. 其他都不管。
我最后用一段修改后的代码介绍两个函数,memcached_get和memcached_set,都可以man出来。
char * result_str; /*这个就是查询的结果*/
std::string query="要查询的数据名";
result_str= memcached_get(memc, query.c_str(), strlen(query.c_str()),
&result_str_length, &flags, &rc);
if (rc == MEMCACHED_SUCCESS)
{
printf("%s",result_str);
free(result_str); /*一定要free掉 memcached传回的数据*/
continue;
}
else if (rc == MEMCACHED_NOTFOUND)
{
/*读取数据*/
...
rc= memcached_set(memc, query.c_str(), strlen(query.c_str()),
str_result.c_str(), strlen(str_result.c_str()),
0, 0);
}
这东西设计得还是很好用的,libmemcached好像是面向对象c语言风格的东西,好不好用就让我们拭目以待吧。
/////////////////////////////////////////////////////////////////////////////////
完整的例子:
#include <stdio.h>
#include <stdlib.h>
#include <libmemcached/memcached.h>
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
memcached_server_st *servers = memcached_servers_parse("127.0.0.1:22222");
memcached_st *memc = memcached_create(NULL);
memcached_server_push(memc, servers);
memcached_server_list_free(servers);
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 0);
string strKey = "1";
string strValue = "hello.world";
memcached_return rc = memcached_set(memc, strKey.c_str(), strlen(strKey.c_str()), strValue.data(), strValue.size(), 0, 0);
if (rc == MEMCACHED_SUCCESS)
{
printf("memcached_set ok! \n");
size_t ValueLength = 0;
uint32_t flags;
char *pValue = memcached_get(memc, strKey.c_str(), strlen(strKey.c_str()), &ValueLength, &flags, &rc);
if (rc == MEMCACHED_SUCCESS)
{
printf("memcached_get key=%s value=%s \n", strKey.c_str(), pValue);
free(pValue);
}
}
memcached_free(memc);
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////
memcached 命令
memcached 命令
comments 类型
1. storage commands: set add replace
2. retrieval commands: get
3. other commands: incr delete
error strings
1. "ERROR\r\n"
客户端发送了一个不存在的command
2. "CLIENT_ERROR <error>\r\n"
客户端的错误:客户端发送的数据或者格式方面有问题。 <error>表示具体错误的原因。
3. "SERVER_ERROR <error>\r\n"
服务器端的错误:服务器一系列的错误阻止了命令的执行。<error>表示具体错误的原因。当发生此错误时。服务器发送完了"SERVER_ERROR <error>\r\n"之后将会关闭connection。(这是唯一的关闭connection的情况)
descriptions of individual commands
1. storage commands
首先客户端向服务器按照如下格式发送命令行:
<command name> <key> <flags> <exptime> <bytes>\r\n
a) <command name> 可以是"set", "add", "replace"。
"set"表示按照相应的<key>存储该数据。
"add"表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败。
"replace"表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败
b) <key> 客户端需要保存数据的key。
c) <flags> 是一个16位的无符号的整数(以十进制的方式表示)。该标志将和需要存储的数据一起存储,并在客户端get数据时返回。客户可以将此标志用做特殊用途,此标志对服务器来说是不透明的。
d) <exptime> 过期的时间。如果该数值为0表示存储的数据永远不过时(但是,该数据有可能被其他项所替换掉。因为服务器采用了LRU(最近最久没有使用)的算法替换)。如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。
e) <bytes> 需要存储的字节数(不包含最后的"\r\n"),当用户希望存储空数据时,<bytes>可以为0
f) 最后客户端需要加上"\r\n"作为"命令头"的结束标志。
<data block>\r\n
紧接着"命令头"结束之后就要发送数据块(即希望存储的数据内容),最后加上"\r\n"作为此次通讯的结束。
reply
当以上数据发送结束之后,服务器将返回一个应答。可能有如下的情况:
a) "STORED\r\n"
表示存储成功
b) "NOT_STORED\r\n"
表示存储失败,但是该失败不是由于错误。通常这是由于"add"或者"replace"命令本身的要求所引起的,或者该项在删除队列之中(见delete命令)。
2 retrieval command
获取数据的格式:
get <key>*\r\n
a) <key>* 表示一个或者多个key(以空格分开)
b) "\r\n" 命令头的结束
reply
服务器端将返回0个或者多个的数据项。每个数据项都是由一个文本行和一个数据块组成。当所有的数据项都接收完毕将收到"END\r\n"
每一项的数据结构:
VALUE <key> <flags> <bytes>\r\n
<data block>\r\n
a) <key> 希望得到存储数据的key
b) <falg> 发送set命令时设置的标志项
c) <bytes> 发送数据块的长度(不包含"\r\n")
d) "\r\n" 文本行的结束标志
e) <data block> 希望接收的数据项。
f) "\r\n" 接收一个数据项的结束标志。
如果有些key出现在get命令行中但是没有返回相应的数据,这意味着服务器中不存在这些项,这些项过时了,或者被删除了。
3. delete
delete 命令格式:
delete <key> <time>\r\n
a) <key> 需要被删除数据的key
b) <time> 客户端希望服务器将该数据删除的时间(unix时间或者从现在开始的秒数)
c) "\r\n" 命令头的结束
reply
a) "DELETED\r\n" 删除成功
b) "NOT_FOUND\r\n" 需要删除的key不存在
ps:"flush_all" command 可以所有项都无效。
4. increment/decrement
command "incr" "decr" 是用来改变数据项数值的命令。设置数据项的数据被认为是一个10进制的无符号的整数。如果当前设置的值不能够被转换则认为是0.如果该数据项的key不存在,则执行命令失败!
命令格式:
incr <key> <value>\r\n
or
decr <key> <value>\r\n
a) <key> 数据项的key
b) <value> 用户希望增加/减少的数据的数值.该数值是一个32位十进制的无符号整形变量。
c) "\r\n" 命令行结束标志
reply
a) "NOT_FOUND\r\n" 没有找到需要操作的项。
b) "<value>\r\n" <value>数据项有效期的最新剩余时间。
注意:
a) 如果一个数据项的有效期被设置为0,这时使用decr命令是无法减少数据。
b) 如果要执行 incr key -1 的操作不会有什么问题,结果和你希望的一样。但是,执行decr -1时的结果一定会让你觉得很意外,因为它的结果无论key的数据是什么结果的都是0.原因是:在这两个命令的执行过程中都是吧-1当做一个无符号的整形处理的。
c) 执行decr命令时数据的长度不会随之而减小,而是在返回数据的后面填补空格。但是执行incr命令越界后会自动的增加数据的位数。
5. 其他命令
"stats": 用来查询服务器提供的内部数据。
stats <args>\r\n
查询特定的数据
reply
STAT <name> <value>\r\n
...
END\r\n
"quit"
"quit\r\n": 退出程序
///////////////////////////////////////////////////////////////////////////////////////////////////
对于 Memcached 缓存系统的基本介绍、安装以及应用 之前有一编文章说过,下面主要是对使用Memcached系统的基本命令以及协议作个简单的分析,个人学习的笔记,呵呵。还希望能给需要的筒子一点参考:
一、Memcache面向对象的常用接口包括:
Memcache::connect -- 打开一个到Memcache的连接
Memcache::pconnect -- 打开一个到Memcache的长连接
Memcache::close -- 关闭一个Memcache的连接
Memcache::set -- 保存数据到Memcache服务器上
Memcache::get -- 提取一个保存在Memcache服务器上的数据
Memcache::replace -- 替换一个已经存在Memcache服务器上的项目
Memcache::delete -- 从Memcache服务器上删除一个保存的项目
Memcache::flush -- 刷新所有Memcache服务器上保存的项目(类似于删除所有的保存的项目)
Memcache::getStats -- 获取当前Memcache服务器运行的状态
For More: http://cn.php.net/memcache
二、查看系统的运行状态:
pid Process id of this server process (memcache服务器的进程ID)
uptime Number of seconds this server has been running (服务器已经运行的秒数)
time Current UNIX time according to the server (服务器当前的UNIX时间)
version Version string of this server (memcache版本)
pointer_size Current system pointer 当前操作系统的指针大小(32位系统一般是32bit)
rusage_user Accumulated user time for this process (该进程累计的用户时间(秒:微妙))
rusage_system Accumulated system time for this process (该进程累计的系统时间(秒:微妙))
curr_items Current number of items stored by the server (服务器当前存储的内容数量)
total_items Total number of items stored by this server ever since it started (服务器启动以来存储过的内容总数)
bytes Current number of bytes used by this server to store items (服务器当前存储内容所占用的字节数)
curr_connections Number of open connections (当前打开着的连接数量)
total_connections Total number of connections opened since the server started running (服务器运行以来接受的连接总数)
connection_structures Number of connection structures allocated by the server (服务器分配的连接结构的数量)
cmd_get Cumulative number of retrieval requests (get命令(获取)总请求次数)
cmd_set Cumulative number of storage requests (set命令(保存)总请求次数)
get_hits Number of keys that have been requested and found present (请求成功的总次数)
get_misses Number of items that have been requested and not found (请求失败的总次数)
threads Current number of thread (当前线程数)
bytes_read Total number of bytes read by this server from network (服务器从网络读取到的总字节数)
bytes_written Total number of bytes sent by this server to network (服务器向网络发送的总字节数)
limit_maxbytes Number of bytes this server is allowed to use for storage. (服务器在存储时被允许使用的字节总数)
evictions Number of valid items removed from cache to free memory for new items (为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items))
其中,最关注最多的几个参数:
uptime:是memcached运行的秒数。
cmd_get:是查询缓存的次数。
cmd_get/uptime 结果是平均每秒请求缓存的次数——结果值越大,说明Memcached的利用率越高,站点的访问量大,如果太低,用文件系统缓存就可以了,根本不会体现出使用memcached的强大性能。
cmd_set:是设置key=>value的次数。整个memcached是个大hash,用cmd_get没有找到的内容,就会调用一下cmd_set写进缓存里。
get_hits:是缓存命中的次数。所谓的命中率 = get_hits/cmd_get * 100%。
get_misses:是缓存未命中的次数。get_misses加上get_hits就等于cmd_get。
stats:显示服务器信息、统计数据等
stats reset:清空统计数据
stats slabs:显示各个slab的信息,包括chunk的大小、数目、使用情况等
stats items:显示各个slab中item的数目和存储时长(最后一次访问距离现在的秒数)
quit:退出
三、利用shell命令操作Memcached
1、数据存储(key为wan,value为123)
2、数据取回
3、替换数据(将以wan为key存储的值替换为122)
4、数值增加 1
5、数值减少 2
6、数据删除
7、查看Memcached当时状态
printf "stats\r\n" | nc 127.0.0.1 11211
8、查看Memcached实时状态
watch "printf 'stats\r\n' | nc 127.0.0.1 11211"
Memcached protocol 中英文档可以参考:
http://blog.s135.com/book/memcached/
四. 查看slabs的使用状况
使用memcached的创造着Brad写的名为 memcached-tool 的Perl脚本,可以方便地获得slab的使用情况(它将memcached的返回值整理成容易阅读的格式)。可以从下面的地址获得脚本:
http://code.sixapart.com/svn/memcached/trunk/server/scripts/memcached-tool
[root@localhost html]# vim memcached-tool
[root@localhost html]# chmod +x memcached-tool
[root@localhost html]# ./memcached-tool 127.0.0.1:11211
# Item_Size Max_age 1MB_pages Count Full?
1 80 B 0 s 1 0 no
2 104 B 12175 s 1 1 no
3 176 B 1339587 s 33 196567 yes
各列的含义:
#: slab class编号
Item_Size: Chunk大小
Max_age: LRU内最旧的记录的生存时间
1MB_pages: 分配给Slab的页数
Count: Slab内的记录数
Full?: Slab内是否含有空闲chunk
五. 也可以图形化监控 Memcached 的运行状态
http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/
是一个PHP源文件,只需要修改源码中的用户名、密码以及数组$MEMCACHE_SERVERS 就可以了。
我的apache php mysql libmemcached memcached 安装实践
参考http://www.hao32.com/webserver/313.html
/sbin/ldconfig 这个命令在安装了新的动态链接库后运行一下,避免依赖此链接库的程序找不到它。
安装apache
wget "http://apache.freelamp.com/httpd/httpd-2.2.15.tar.gz"
tar -xzf httpd-2.2.15.tar.gz
cd httpd-2.2.15
./configure --prefix=/home/zhaigy/apache_n --enable-so
make
make install
安装php
wget "http://cn.php.net/distributions/php-5.3.2.tar.gz"
tar -xzf php-5.3.2.tar.gz
cd php-5.3.2
./configure --prefix=/home/zhaigy/php_n --with-apxs2=/home/webadm/bin/apxs
make
make install
修改httpd.conf
user zhaigy
group zhaigy
LoadModule php4_module modules/libphp4.so (这一项在装完php后会自动添加)
AddType application/x-httpd-php .php (这一项手工添加)
chown -R zhaigy.zhaigy /home/zhaigy/apache_n
启动apache
cd /home/zhaigy/apache_n
./bin/apachectl start
测试
netstat -npl
浏览器打开首页测试
查看phpinfo信息 (可获知:Configuration File (php.ini) Path /home/zhaigy/php_n/lib )
给php添加mysql扩展
cd /home/zhaigy/php-5.3.2/ext/mysql
/home/zhaigy/php_n/bin/phpize
./configure --help
./configure --with-php-config=/home/zhaigy/php_n/bin/php-config --with-mysql="/home/zhaigy/mysql-5.1.22-rc-linux-x86_64-glibc23"
或者./configure --with-php-config=/home/zhaigy/php_n/bin/php-config --with-mysql="mysqlnd"
make
make install 显示 Installing shared extensions: /home/zhaigy/php_n/lib/php/extensions/no-debug-non-zts-20090626/
cd /home/zhaigy/php_n/
mkdir modules
cp /home/zhaigy/php_n/lib/php/extensions/no-debug-non-zts-20090626/mysql.so ./modules
编写php.ini 参考 http://lamp.linux.gov.cn/PHP/php-5_2-ini.html
修改extension_dir = "/home/zhaigy/php_n/modules"
extension = mysql.so
chown -R zhaigy.zhaigy /home/zhaigy/php_n
重启apache
cd /home/zhaigy/apache_n
./bin/apachectl restart
netstat -npl|grep httpd
php安装源码中不包含的其它扩展,例如 memcached
################################
这个可以不安装
安装 memcached
wget "http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz"
tar -xzvf memcached-1.4.5.tar.gz
cd memcached-1.4.5
./configure --prefix=/home/zhaigy/memcached_n --enable-64bit
make
make install
################################
需要先安装libmemcached
cd /home/zhaigy
wget "http://launchpad.net/libmemcached/1.0/0.42/+download/libmemcached-0.42.tar.gz"
tar -xzf libmemcached-0.42.tar.gz
cd libmemcached-0.42
./configure --prefix=/home/zhaigy/libmemcached_n --without-memcached
--非常的痛苦啊,编译安装在这里总是失败,从网上找的解决方法也不能用
痛苦的3小时
--
无意中使用了旧的版本,发现编译错误少了几个,嗯,找更旧的
cd /home/zhaigy
wget "http://launchpadlibrarian.net/33299675/libmemcached-0.28.tar.gz"
tar xzvf libmemcached-0.28.tar.gz
cd libmemcached-0.28
./configure --prefix=/home/zhaigy/libmemcached_n --without-memcached
make
make install
--这次比较顺利,估计是因为机器上的gcc版本低吧
cp /home/zhaigy/php_n
./bin/pecl -h
./bin/pecl download memcached
tar -xf memcached-1.0.2.tar
cd memcached-1.0.2
/home/zhaigy/php_n/bin/phpize
./configure --with-php-config=/home/zhaigy/php_n/bin/php-config --with-libmemcached-dir="/home/zhaigy/libmemcached_n"
make 这里也遇到编译错误
降低版本
/home/zhaigy/php_n/bin/pecl download memcached-1.0.0
tar -xvf memcached-1.0.0.tar
cd memcached-1.0.0
/home/zhaigy/php_n/bin/phpize
./configure --with-php-config=/home/zhaigy/php_n/bin/php-config --with-libmemcached-dir="/home/zhaigy/libmemcached_n"
make
make install
--顺利
安装到php
cd /home/zhaigy/php_n/
mkdir modules
cp /home/zhaigy/php_n/lib/php/extensions/no-debug-non-zts-20090626/memcached.so ./modules
php.ini中添加
extension = memcached.so
cd /home/zhaigy/apache_n
./bin/apachectl restart
从phpinfo中查看,正常
libmemcached 安装使用
什么是 libmemcached ?
顾名思义,libmemcached 是一个 memcached 的库,客户端库,C 和 C++ 语言实现的客户端库,官方网站: http://tangent.org/552/libmemcached.html 。
需要注意的是, libmemcached 不是 libmemcache ,它们是两个不同的客户端库,前者现在的开发比较活跃,后者已经有很长时间没有更新了。
memcached 是一个高性能、分布式的内存对象缓存系统,通过内存的数据缓存来降低对数据库的访问,从而提高动态内容应用网站的速度。memcached 官方开发释放出来的,只是应用的服务器端程序,它发布了服务器端的连接读写协议,客户端的实现,则根据动态内容应用网站使用的动态脚本的不同,而有多种,具体列表,可查看官方网站。
libmemcached 就是使用 C 和 C++ 语言实现的 memcached 协议的客户端函数库。新版中,还添加了几个命令行工具,方便使用。编译安装 libmemcached 时,需要 memcached 安装在默认系统路径中,如果 memcached 安装在了其他路径,则可能因为找不到 memcached 文件而安装失败。
安装 libmemcached :
$ tar -xzvf libmemcached-0.31.tar.gz
$ cd libmemcached-0.31
$ ./configure
$ make
# make install
安装完成后,libmemcached 的文件包括:
/usr/local/bin/ 目录下
memcat memcp memdump memerror memflush memrm memslap memstat
都是可执行文件,是一些命令行工具,具体使用,可参考官方文档,或帮助。
/usr/local/include/libmemcached 目录下是该函数库的一些头文件
/usr/local/lib 目录下
libmemcached* 等文件,都是库文件。
/usr/local/share/man1 目录下,有 memcat 等命令行工具的 man 帮助文件。
/usr/local/share/man3 目录下,是函数库的一些帮助文件。
命令行工具中,memstat 可在命令行查看 memcached 服务器的情况,比如:
$ memcat --servers=127.0.0.1:11211
输出的为 memcached 服务器的一些统计数据等。
订阅:
博文 (Atom)