分类: Cache

MongoDB和php的mongo拓展的安装

一条评论

2011 年 12 月 19 日 at 下午 8:38分类:Cache | NoSQL | PHP

MongoDB的安装:

# wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.2.tgz
# tar zxvf mongodb-linux-x86_64-2.0.2.tgz
# mv mongodb-linux-x86_64-2.0.2 /usr/local/mongodb
# cd /data
# mkdir mongodb
# cd /usr/local/mongodb/
# touch logs

安装完毕!这个安装是史上最简单的了
启动MongoDB

# ./bin/mongod --dbpath=/data/mongodb/ --logpath=/usr/local/mongodb/logs.log --logappend  --port=27017 --fork --source=127.0.0.1

如果要是设置开机启动那么就把这个命令写到/etc/rc.local里面去吧!
另外这里启动有一个地方要说下,那就是关于验证的问题,这个不像Mysql任何时候都需要用户名和密码才能进入数据库,这个如果你在启动的时候,没有说明要验证的情况下,那么操作MongoDB是不需要验证的,但是如果在启动的时候设置了需要验证的话,那么在操作MongoDB就需要输入用户名和密码了。
如果需要用户的验证的那么就是在启动的命令中加入 –auth 参数,不需要的话就不用加,或者是加 –noauth
如果说开启了验证的,那么在操作MongoDB的时候,需要输入用户名密码,那么这个用户密码从哪里来呢?我一开始也纠结了一会,后来明白了,这个跟mysql数据库还是差不多的,存在一个用户表admin,这个表里面的用户就是MongoDB的管理用户列表,和mysql相似,同时,在操作具体的某个数据库的时候,还需要你去认证,而这个用户是针对当前这个数据库的,如果你先use admin,然后db.auth(‘name’,'passwd’)验证通过了,那么其他数据库就不用验证了,如果你你走这步,那么你就需要针对不同数据库,输入不同的用户名密码进行验证了,这点和mysql是一样的!
举个例子:我在MongoDB中有个数据库TEST,如果开启了验证模式,那么我想进入这个数据库进行操作,那么就需要进行db.auth(‘name’,'passwd’)进行验证,同时我可以先通过admin表的验证,那么也就通过其他所有表的验证了!增加用户的话,要先use dbname,然后在使用db.addUser(‘name’,'passwd’)就可以了。

简单的参数说明:
–logpath 日志文件路径
–master 指定为主机器
–slave 指定为从机器
–source 指定主机器的IP地址
–pologSize 指定日志文件大小不超过64M.因为resync是非常操作量大且耗时,最好通过设置一个足够大的oplogSize来避免resync(默认的 oplog大小是空闲磁盘大小的5%)。
–logappend 日志文件末尾添加
–port 启用端口号
–fork 在后台运行
–only 指定只复制哪一个数据库
–slavedelay 指从复制检测的时间间隔
–auth 是否需要验证权限登录(用户名和密码)
–noauth 不需要验证权限登录(用户名和密码)

PHP的MongoDB拓展的安装:

# wget http://pecl.php.net/get/mongo-1.2.6.tgz
# tar zxvf mongo-1.2.6.tgz
# cd mongo-1.2.6
# /usr/local/php/bin/phpize
# ./configure --enable-mongo=share --with-php-config=/usr/local/php/bin/php-config
# make && make installl 

将生成的拓展mongo.so文件添加到php.ini中,重启php-fpm,然后查看下phpinfo()

安装成功!之后就是测试了。。。

相关资料:
1:http://www.cnblogs.com/zengen/archive/2011/04/23/2025722.html
2:http://blog.csdn.net/liuyuanshijie/article/details/6735621

redis缓存的安装和使用

没有评论

2011 年 12 月 17 日 at 下午 3:03分类:Cache | Linux | NoSQL | PHP | WEB开发

首先说下什么事redis,之前在我的博客中降到很多的缓存诸如:memcache,memcached,memcachedb,dbcached等,今天讲的这个redis跟这几个差不多,redis是一个key-value存储系统。 和Memcached(这里指服务,客户端有memcache和memcached两种)类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集 合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis 支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改 操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
如果说把memcache,memcached,memcachedb,dbcached以及redis进行分类的话,我会把memcache和memcached分为一类,其实后者是前者的升级版,而memcachedb,dbcached和redis可以分为一类,因为他们在记住内存的同时会把数据写到磁盘文件中,达到持久性存储的目的,个人认为可以把这三者归结为Nosql的范畴。

在linux上面安装redis

# wget http://redis.googlecode.com/files/redis-2.4.4.tar.gz
# tar zxvf redis-2.4.4.tar.gz
# mv redis-2.4.4 /usr/local/redis
# cd /usr/local/redis
# make && make install

安装完成后,会自动copy可执行文件到环境变量中,不要自己去copy了。

# redis-
redis-benchmark   redis-check-dump  redis-server  
redis-check-aof   redis-cli

之后就是配置redis了,配置文件位于/usr/local/redis下面的redis.conf
配置项根据个人而定,一下是我的配置项:

#是否以后台进程运行,默认为no
daemonize yes
#如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid
pidfile /var/run/redis/redis.pid
#监听端口,默认为6379
port 6379
#绑定主机IP,默认值为127.0.0.1(注释)
bind 127.0.0.1
#超时时间,默认为300(秒)
timeout 300
#日志记录等级,有4个可选值,debug,verbose(默认值),notice,warning
loglevel verbose
#日志记录方式,默认值为stdout
logfile stdout
#可用数据库数,默认值为16,默认数据库为0
databases 16
#指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。
#900秒(15分钟)内至少有1个key被改变
save 900 1
#300秒(5分钟)内至少有10个key被改变
save 300 10
#存储至本地数据库时是否压缩数据,默认为yes
rdbcompression yes
#本地数据库文件名,默认值为dump.rdb
dbfilename redis.rdb
#本地数据库存放路径,默认值为 ./
dir /data/redis/
#当本机为从服务时,设置主服务的IP及端口(注释)
slaveof <masterip> <masterport>
#当本机为从服务时,设置主服务的连接密码(注释)
masterauth <master-password>
#连接密码(注释)
requirepass foobared
#最大客户端连接数,默认不限制(注释)
maxclients 128
#设置最大内存,达到最大内存设置后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,任到达最大内存设置,将无法再进行写入操作。(注释)
maxmemory <bytes>
#是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上#面#save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认值为no
appendonly yes
#更新日志文件名,默认值为appendonly.aof(注释)
appendfilename /root/redis_db/appendonly.aof
#更新日志条件,共有3个可选值。no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次(默认值)。
appendfsync everysec
#是否使用虚拟内存,默认值为no
vm-enabled yes
#虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
vm-swap-file /tmp/redis.swap
#将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的 (Redis的索引数据就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0。
vm-max-memory 0
#虚拟内存文件以块存储,每块32bytes
vm-page-size 32
2#虚拟内在文件的最大数
vm-pages 134217728
#可以设置访问swap文件的线程数,设置最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.
vm-max-threads 4
#把小的输出缓存放在一起,以便能够在一个TCP packet中为客户端发送多个响应,具体原理和真实效果我不是很清楚。所以根据注释,你不是很确定的时候就设置成yes
glueoutputbuf yes
#在redis 2.0中引入了hash数据结构。当hash中包含超过指定元素个数并且最大的元素没有超过临界时,hash将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值
hash-max-zipmap-entries 64
#hash中一个元素的最大值
hash-max-zipmap-value 512
#开启之后,redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。当你的使 用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。如果没有这么严格的实时性要求,可以设置 为yes,以便能够尽可能快的释放内存
activerehashing yes

配置好了之后来启动redis

# redis-server /usr/local/redis/redis.conf
# netstat -anpt | grep 6379   //查看进程是否启动

现在你可以用telnet来链接并进行数据的存储测试。
我们现在来安装php的redis拓展

# wget https://github.com/owlient/phpredis/tarball/master
# mv owlient-phpredis-2.1.1-1-g90ecd17.tar.gz phpredis-2.1.1-1.tar.gz
# tar zxvf phpredis-2.1.1-1.tar.gz
# mc owlient-phpredis-2.1.1-1-g90ecd17 phpredis-2.1.1
# cd  phpredis-2.1.1
# /usr/locla/php/bin/phpize
# ./configure --enable-redis=share --with-php-config=/usr/local/php/bin/php-config
# make && make install

之后在php的拓展目录下面会有redis.so文件生成,然后把这个加到php.ini中就行了,记得重启php-fpm哦。
PS:我们在安装php的拓展的时候,记得一定要加上–enable-theNameOfTheExtensions=share还有后面的php-config文件路径。虽然有些时候不会报错,但是尽量还是加上好,我曾经就因为装一个facedetect.so这个拓展,没有加那两句话,结果php一直不能认识这个拓展,然后phpinfo里面也没有这个拓展,害了我花了很长时间。
php的测试代码

<?php  
$redis = new Redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->set('fbbin',serialize(array('中华人民共和国','美利坚合众国')));  
print_r(unserialize($redis->get("fbbin"))); 

能够正确输出信息,搞定。
上面的代码之所以要序列化,好像redis不支持Array类型的数据,我一开始并没有序列化,然后得出的结果就是“Array”,而不是我要的数组数据,所以我把它序列化了。到底是不支持还是我哪里的配置问题,还有待考究啊,希望哪位牛人能give me a hand。

memcached运行和内存使用情况的监控

2条评论

2011 年 12 月 16 日 at 下午 3:08分类:Cache | PHP | WEB开发

之前都是在讲关于memcache的一些操作啊和配置等得问题,但是我们安装好服务之后,并且服务端和客户端都能够正常工作了,那么这个时候我们怎么知道内存的使用的情况呢,以及memcache是否正常运行呢?
大概很多人都不知道在memcache的源码包里面有个文件叫做:memcache.php这个功能就为我们的监控做了完整的事情,我们只需要 借助它,那么一切就OK了。
只需要把这个文件copy到你的web根目录,然后修改一下代码:

define('ADMIN_USERNAME','fbbin');     // Admin Username
define('ADMIN_PASSWORD','binbin');      // Admin Password

$MEMCACHE_SERVERS[] = '127.0.0.1:11211'; // add more as an array

然后我们通过URL访问这个文件,如果正常的话,会得出如下界面,如果不正常的话,请自行找原因。

上图中的东西,我相信大家都能看懂
Hits: 1330 (90.9%) #点击了29
Misses: 133 (9.1%) #尚未使用的133
此外它还能对指定的key值进行管理。如下图

从上面可以看出,可以对KEY的值进行删除操作。

OK!

web做集群时,利用memcache来同步session

一条评论

2011 年 12 月 16 日 at 上午 11:09分类:Cache | PHP | WEB开发

记得以前做集群服务时,同步session的问题有些时候是借助COOKIE来使用的,有些时候是通过共享文件的方式来做,最多的还是通过memcache来做,不过之前做得跟以下讲得很不一样,以前的做法是完全不用PHP自带的session,而是借助memcache的缓存原理来实现一个memcache,这样子做当然是可以的!但是今天讲得是一种更简单的额方法。我个人觉得用memcache来同步session是最好的。
首先我模拟了一个web集群的,我启动两个memcached进程:

# /usr/local/bin/memcached -d -p 11211 -u root -m 64 -c 1024 -P /var/run/memcached/memcached1.pid
# /usr/local/bin/memcached -d -p 11212 -u root -m 64 -c 1024 -P /var/run/memcached/memcached2.pid

这样子服务算是简单的启动了,下面配置下php.ini这个文件

session.save_handler = "memcache"
memcache.hash_strategy = "consistent"  #这个memcache在php.ini中配置项,还有很多,可以根据phpinfo里面来看它的配置项
session.save_path = "tcp://127.0.0.1:11211?weight=1,tcp://127.0.0.1:11212?weight=2"

简单的说明:
第一行,session的储存方式是memcache;第二行,memcache的hash算法是consistent;第三行,session储存的位置;
然后重启php-fpm

#  /etc/rc.d/init.d/php-fpm stop
#  /etc/rc.d/init.d/php-fpm start

此时你查看phpinfo页面的关于session的信息如下:
Session Support enabled
Registered save handlers files user sqlite memcache
Registered serializer handlers php php_binary
紧接着下面是
session.save_path tcp://127.0.0.1:11211?weight=1,tcp://127.0.0.1:11212?weight=2 tcp://127.0.0.1:11211?weight=1,tcp://127.0.0.1:11212?weight=2

测试下成不成功:

<?php
session_start();
$_SESSION['sessionTestData'] = 'fbbin code!';
echo session_id();
?>

通过memcache来获取刚刚存得数据

<?php  
$mem = new Memcache;  
$mem->addServer("127.0.0.1",11212)or die ("Could not add server 11212");  
$mem->addServer("127.0.0.1",11211)or die ("Could not add server 11211");  
$val = $mem->get('ind40dbsjobtq2k8lnfmv5eps5');    //上面输出的session_id()
echo $val;  
?> 

得出的结果是:

sessionTestData|s:12:"fbbin code!";

测试成功!关于这个时间的有效性跟session和memcache有关系。

基于libmemcached,php扩展memcached的安装

一条评论

2011 年 12 月 15 日 at 下午 8:09分类:Cache | Linux | PHP | WEB开发

1:为什么要装memcached扩展
memcached的1.2.4及以上增加了CAS(Check and Set)协议,对于同一key的多进程的并发处理问题。这种情况其实根数据库很像,如果同时有几个进程对同一个表的同一数据进行更新的话,那会不会打架呢,哈哈。数据库里面可以锁定整张表,也可以锁定表里面一 行的功能,其实memcached加入的CAS根这个差不多。php的扩展memcache,不支持cas,而它的升级版memcached支持,所以我们要装memcached扩展,memcached扩展是基于libmemcached,所以要先安装libmemcached,php的memcache拓展的服务端是memcached这个服务,既然是它的升级版,那么php的memcached拓展的服务端同样也是memcached,只不过php的memcached拓展还需要在服务端安装libmemcached这个依赖条件,因此我们要先安装这个libmemcached。
2:安装libmemcached

#  wget http://launchpad.net/libmemcached/1.0/1.0.2/+download/libmemcached-1.0.2.tar.gz
#  tar zxvf libmemcached-1.0.2.tar.gz
#  cd  libmemcached-1.0.2
# ./configure --prefix=/usr/local/libmemcached --with-memcached
# make && make install

安装注意问题:
1: 安装过程中不要忘了,–with-memcached,不然会提示你
checking for memcached… no
configure: error: “could not find memcached binary”
2:你的memcached是不是1.2.4以上的,如果不是会提示你
collect2: ld returned 1 exit status
make[2]: *** [clients/memslap] Error 1
make[2]: Leaving directory `/home/zhangy/libmemcached-0.42′
解决办法是–disable-64bit CFLAGS=”-O3 -march=i686″,如果不用这个64位的long型数据,我想php扩展memcached,memcache也就没什么区别了,memcached也就没什么意思了。
3:安装PHP的memcached拓展

# wget http://pecl.php.net/get/memcached
# cd memcached-2.0.0b2
# /usr/lcoal/php/bin/phpize
#  ./configure --enable-memcached --with-php-config=/usr/local/php/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached --with-memcached --with-zlib-dir=/usr/local/zlib --enable-memcached-igbinary
#  make && make install

上面的编译时的 “–with-zlib-dir=/usr/local/zlib”这句话, 如果说你要在缓存数据时用到压缩等函数的话,那么就需要安装zlib这个包,如果不需要压缩的话那就不需要安装了。安装方法如下

# wget http://download.chinaunix.net/down.php?id=24014&amp;amp;ResourceID=12241&amp;amp;site=1
# tar -xvzf zlib-1.2.3.tar.gz
# cd zlib-1.2.3.tar.gz
# ./configure  --prefix=/usr/local/zlib
# make && make install

上面编译时的–enable-memcached-igbinary这句话,igbinary是一个序列化工具,它将php的数据结构存储为紧密的二进制形式,在时间和空间上都有所改进,可以提高性能。要想带上这个参数那么就需要安装它 ,如下操作

# http://pecl.php.net/get/igbinary-1.1.1.tgz
# cd igbinary-1.1.1
# /usr/lcoal/php/bin/phpize
# ./configure
# make && make install

完成之后也是一个php的拓展,需要添加到php.ini中去,那么上面安装时携带的参数才有效!

上面的拓展安装好之后会
出现需要的memcached.so文件的地址,然后把这个拓展添加早php.ini中,然后重启下php-fpm就可以了!
测试的代码:

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);
$items = array(
    'key1' => 'value1',
    'key2' => 'value2',
    'key3' => 'value3'
);
$m->setMulti($items);
$m->getDelayed(array('key1', 'key3'), true, 'result_cb');
function result_cb($memc, $item)
{
    var_dump($item);
}
echo "<hr />";
//$m->set('fbbin',date('Y-M-D H:I:S'));
echo $m->get('fbbin'); //return : 2011-Dec-Tue 06:0:th

linux上持久性存储服务dbcached的安装

3条评论

2011 年 11 月 24 日 at 上午 9:47分类:Cache | Linux | PHP

dbcached 是一款基于 Memcached 和 NMDB 的分布式 key-value 数据库内存缓存系统。dbcached = Memcached + 持久化存储管理器 + NMDB 客户端接口以此来实现的,这个和之前说的memcachedb在功能上面都是一样的,都是实现持久性的数据存储功能,但是他们肯定有不同点,其中dbcachedb是基于Memcached 内存缓存性能优势方面来设计的,而memcachedb是使用 Berkeley DB 数据库自身的缓存来实现,是围绕 Berkeley DB 进行开发的,更多的不同点去找谷歌大神吧!
dbcached安装需要以下三个包:
1、http://dbcached.googlecode.com/files/dbcached-1.0.beta2.tar.gz
2、http://fallabs.com/qdbm/qdbm-1.8.78.tar.gz
3、http://auriga.wearlab.de/~alb/nmdb/files/0.21/nmdb-0.21.tar.gz
我们先来安装第二个和第三个包,第二个包是一个管理数据库的例程库,QDBM 读写速度比 Berkeley DB 要快,相当于是一个DB,
然后再来安装第三个包,它是一款多协议网络数据库(dbm类)管理器,它由内存缓存和磁盘存储两部分构成,使用 QDBM 或 Berkeley DB 作为后端数据库。
最后再来安装dbcahed,为什么要按照这个顺序来安装,原因是在安装完dbcached的时候需要启动这个服务,但是启动这个需要qdbm这个服务,除非你只是把它当作一个简单memcahed服务来跑。
安装QDBN:

# wget http://fallabs.com/qdbm/qdbm-1.8.78.tar.gz
# tar zxvf qdbm-1.8.78.tar.gz
# cd qdbm-1.8.78
# ./configure --prefix=/usr
# make && make install
# cd ..

安装NMDB管理器:

# wget http://auriga.wearlab.de/~alb/nmdb/files/0.21/nmdb-0.21.tar.gz
# tar zxvf nmdb-0.21.tar.gz
# cd nmdb-0.21
# make BACKEND=qdbm ENABLE_TIPC=0 ENABLE_SCTP=0 install
# cd ..

启动NMDB这个管理器

 # /usr/local/bin/nmdb -d /data/nmdb/dbcached.db -t 26010 -T 192.168.214.138 -u 26010 -U 192.168.214.138 -c 1024
/**
-d 数据库路径(这里使用比 Berkeley DB 更快的 QDBM 数据库),例如我把数据库文件放在/data/nmdb/dbcached.db
-t TCP 监听端口 (默认:26010)
-T TCP 监听地址 (默认:任何地址)
-u UDP 监听端口 (默认:26010)
-U UDP 监听地址 (默认:任何地址)
-c 最大的缓存对象数目,单位为千 (默认:128) 
*/

这些参数在等会的dbcachedb的启动过程中是会用到的,如果在启动的过程中报一个erring的错误说一个lib***.so的什么文件找不到,那么就需要把/usr/lib/目录下面的相应文件CP到/usr/lib64/目录下,然后再执行上面的启动命令就不会有问题了。
安装dbcached:

# wget http://dbcached.googlecode.com/files/dbcached-1.0.beta2.tar.gz
# tar zxvf dbcached-1.0.beta2.tar.gz
# cd dbcached-1.0.beta2
# ./configure --prefix=/usr/local/dbcached
# make && make install

安装完毕,启动它:

/usr/local/dbcached/bin/memcached -d -m 256 -p 11213 -c 1024 -u root -x 192.168.214.138 -y 26010 -z 26010
/**
-x nmdb 服务器的域名或者IP地址,推荐使用IP地址
-y <端口号> nmdb 服务器的TCP端口号 (默认: 26010) 支持 set/delete/... 等写命令 和 get 等读命令
-z <端口号> nmdb 服务器的UDP端口号 (默认: 26010) 只支持 get 等都命令, 当使用 -z 参数时,将使用 UDP 协议代替 TCP 协议执行 set 操作,执行 get 操作时仍然使用 TCP 协议。强烈推荐加上 -z 参数。
*/

安装完毕,看下测试文件:

$m = new Memcache;
if( $_GET['db'] )
{
if($_GET['db'] == '1')
   $m->connect('192.168.214.138','11211') or die('can not connect memcache server!'); //memcache
elseif($_GET['db'] == '2')
   $m->connect('192.168.214.138','11212') or die('can not connect memcachedb server!'); //memcachedb
elseif($_GET['db'] == '3')
   $m->connect('192.168.214.138','11213') or die('can not connect dbcached server!'); //dbcached	
}
else
{
	die("请选择缓存的类型(设置DB变量)");
}
$m->set('test_key','test_value');
echo $m->get('test_key');

数据输出正常,然后重新启动服务器,数据照样存在,此外在你的/data/nmdb/dbcached.db文件中已经有数据了,你重新set一次值,那么这个文件的size就会增加写入内容的byte数。

OK !!

参考资料:
1、http://blog.s135.com/post/329/
2、http://www.4ucode.com/Study/Topic/1007644

使用fastcgi_cache加速你的Nginx网站

没有评论

2011 年 11 月 20 日 at 下午 9:36分类:Cache | Nginx | PHP

  对于变化不太频繁的数据,大家都比较喜欢存Memcached以减少数据库的读取,但还是会有语言解析运行上的消耗(比如运行PHP,Python等),当然这个时间很短,记得OP上有个同学说P字头的语言,效率都不高,如果能省去,当然最好。(已经用上Squid等的可以忽略本文)。还有一个问题就是很多时候一个页面由多个数据片断组成,为了提高页面速度,要么分别缓存,要么整体缓存(所谓的Page Cache),其实都比较麻烦,增加和减少数据片断的时,大多需要调整。最后一个问题,所有的数据都存Memcached是否经济?服务器资源足够多的无所谓,捉襟见肘的就要考虑了,当然,生成静态页面是一种方法,需要维护,还是比较累。好吧,nginx的fastcgi_cache可以解决上面的那些问题,比较squid等的好处是简单,不需再要去维护另外一个系统,适合不那么大的网站。
关于Nginx fastcgi_cache,基础的可以参看Nginx官方文档http://wiki.nginx.org/HttpFcgiModule,下面是一个典型的做法是:

fastcgi_temp_path /data/ngx_fcgi_tmp;
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
fastcgi_cache_valid 200 301 302 1d;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_cache_key $request_method://$host$request_uri;
 

  注意一定要加上$request_method作为cache key,否则如果HEAD类型的先请求会导致后面的GET请求返回为空,全局定义一个缓存空间,配置文件名为,fastcgi_cache.conf,然后在vhost配置里面加上:

fastcgi_cache ngx_fcgi_cache;
include fastcgi.conf;
 

  大概解释下各个参数的含义:
  fastcgi_temp_path:生成fastcgi_cache临时文件目录
  fastcgi_cache_path:fastcgi_cache缓存目录,可以设置目录哈希层级,比如2:2会生成256*256个字目录,keys_zone是这个缓存空间的名字,cache是用多少内存(这样热门的内容nginx直接放内存,提高访问速度),inactive表示默认失效时间,max_size表示最多用多少硬盘空间,需要注意的是fastcgi_cache缓存是先写在fastcgi_temp_path再移到fastcgi_cache_path,所以这两个目录最好在同一个分区,从0.8.9之后可以在不同的分区,不过还是建议放同一分区。
  fastcgi_cache_valid:定义哪些http头要缓存
  fastcgi_cache_use_stale:定义哪些情况下用过期缓存
  fastcgi_cache_key:定义fastcgi_cache的key,示例中就以请求的URI作为缓存的key,Nginx会取这个key的md5作为缓存文件,如果设置了缓存哈希目录,Nginx会从后往前取相应的位数做为目录。
  fastcgi_cache:用哪个缓存空间
  这样就可以了,基本上可以work,但还没完,如何手动清除缓存?有个Nginx的第三方扩展可帮你做到:https://github.com/FRiCKLE/ngx_cache_purge/,如果对大多数第三方扩展无爱,写个清除的脚本也非常简单,以PHP为例:

<?php
function purgeCache()
{
    $url = $this->post('url');
 
    if (empty($url) || !Cola_Com_Validate::url($url)) {
        exit('请输入正确的URL。');
    }
 
    $md5 = md5($url);
    $cacheFile = $this->_cacheRoot . '/' . substr($md5, -2, 2) . '/' . substr($md5, -4, 2) . '/' . $md5;
 
    if (!file_exists($cacheFile)) {
        exit('缓存不存在。');
    }
 
    if (@unlink($cacheFile)) {
        echo '清除缓存成功。';
    } else {
        echo '清除缓存失败。';
    }
}
 

  核心是第11行,直接找到缓存文件,然后删掉就可以,这个脚本有个副作用,手动清除之后,缓存失效,但Nginx后面还会自己清除一遍,然后报个unlink失败的日志,不过无关紧要了。
  淡定,文章还没完,要不就成标题党了,Nginx fastcgi_cache缓存很不错,但我只想在某些页面用fastcgi_cache,很简单,有两种方法,一是在location中定义fastcgi_cache,这样只有满足一定规则的url才会用上cache,其他的就不会了;另外一种方法是在你不需要缓存的页面上,输出禁止缓存的头信息,用ColaPHP的话,直接$this->response->disableBrowserCache(); 具体代码:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
 

如果用CI的话,那么就是:

$this->output->set_header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
$this->output->set_header('Last-Modified: '.gmdate('D, d M Y H:i:s', $last_update).' GMT');
$this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate");
$this->output->set_header("Cache-Control: post-check=0, pre-check=0");
$this->output->set_header("Pragma: no-cache");

  这样就告诉Nginx,这个页面不需要缓存。
  好吧,要淡定不要D疼,还有最后一个问题,如果页面中只有一小部分内容不可以缓存,可以用Nginx fastcgi_cache吗?比如某个内容页,大部分内容可以缓存,但希望把用户的登录信息更新上去。答案是肯定的,可以直接输出用户未登录的页面样式,等页面加载完毕之后,通过ajax异步更新用户信息

原文来源:http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2011/1118/9312.html

linux上memcachedb存储引擎的安装

没有评论

2011 年 11 月 16 日 at 下午 2:41分类:Cache | Linux | PHP

在安装memcachedb服务之前如果要调试的话,还需要安装上memcache和memcached这两个东西,当然我这边是基于PHP环境来操作的!
在PHP中安装memcache过程命令如下:

#yum install libevent libevent-devel   #安装依赖包
#cd /usr/local/src
#ll
#wget http://pecl.php.net/get/memcache-2.2.6.tgz
#tar vxzf memcache-2.2.6.tgz
#cd memcache-2.2.6
#/usr/local/php/bin/phpize
#./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config --with-zlib-dir
#make
#make install

再来安装memcached服务

cd /usr/local/src/
wget http://memcached.googlecode.com/files/memcached-1.4.10.tar.gz
ll
tar zxvf memcached-1.4.10.tar.gz
cd memcached-1.4.10
./configure
make
make install

启动memcached服务

 memcached -d -m 10 -u root -l 122.225.117.253 -p 11211 -c 256 -P /tmp/memcached.pid

要想在php中能用memcache那么酒吧memcache.so文件添加到php.ini文件中!
===================================================================================
安装memcachedb服务需要以下包:
berkeleydb : http://download.oracle.com/otn/berkeley-db/db-4.7.25.tar.gz
memcachedb : http://memcachedb.googlecode.com/files/memcachedb-1.2.0.tar.gz

安装berkeleydb

# tar zxvf db-4.7.25.tar.gz
# cd db-4.7.25/build_unix/
# ../dist/configure
# make
# make install

安装memcachedb

# tar zxvf memcachedb-1.2.0.tar.gz
# cd memcachedb-1.2.0
# ./configure
# make
# make install

这上面的安装可能需要版本的匹配的问题,我之前安装的berkeleydb是最新版的5.2的,但是我在安装memcachedb1.2时,发现这个1.2版本的需要的berkeleydb版本是4.7的,因此我这边安装的berkeley版本是4.7的。
以上为止,memcachedb存储引擎安装完毕了。
启动memcachedb服务:

//端口是11212
memcachedb -p 11212 -d -r -u root -l 192.168.50.117 -H /data/mdb_11212 -N -P /tmp/memcachedb.pid

如启动报Berkeley Db的文件找不到那么执行以下这句话:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/BerkeleyDB.4.7/lib

以下是关于memcache和memcachedb的测试代码

$m = new Memcache;
if( $_GET['db'] )
   $m->connect('192.168.214.138','11211') or die('can not connect memcache server!'); //memcache
else
   $m->connect('192.168.214.138','11212') or die('can not connect memcachedb server!'); //memcachedb

memcache和memcachedb两者主要是存储方式不一样,一个是存储在内存中,一个用的是Berkeley的文件数据库和memcachedb的网络性能,实际上是支持memcache的很多方法,然后解除了丢失数据的风险,当然,会带来性能上的小损失。
两者的使用方法是完全一样的。

参考:

http://www.cnblogs.com/eoiioe/archive/2008/11/11/1331238.html

http://hi.baidu.com/hqlulu/blog/item/530df6fe7c0396365d600842.html