|
本帖最后由 hulei0102 于 2012-10-8 14:08 编辑
前段时间写了一篇《优化ci缓存机制,扩展CI_Output 》http://codeigniter.org.cn/forums/thread-11515-1-1.html
上述文章的方法在文件缓存>100万后,灾难再次发生!性能简直无法忍受,比不用缓存还要慢
因此我决定用Mongodb来做页面缓存!为什么是Mongodb而不是其他的nosql?因为本人用的是win,目前官方支持win的nosql我找来找去也只有这一个,没法子!
废话不多说上代码,以下配置及代码适用ci版本,2.1.x
1、首先你要安装mongodb,要注意的是win2003(含)、xp(含)以前你都只能用Mongodb2.0.x ,下载地址:http://downloads.mongodb.org/win32/mongodb-win32-i386-2.0.7.zip
。win2003以上版本,win7以上可以使用最新2.2.x版本,这里地址就不放了。
2、下载mongodb的php驱动,这里要注意如果你是源码编译是没有问题的,如果不是请选择Thread-Safe Mongo extension这个版本(我没试过行不行)。我是从一个三方网站下的php5.3驱动vc9的再编译版本。
3、配置php.ini,加入
extension=php_mongo-1.2.12-5.3-vc9.dll
4、重启服务
5、命令行,启动mongodb
h:\mongodb\bin\mongod.exe -dbpath h:\mongodb\data
h:\mongodb\data 是数据存放目录。
6、扩展CI_Output
新建:Application\\core\\My_Output.php,只扩展_write_cache、_display_cache2个函数
PHP复制代码
function _write_cache ($output)
{
$CI =& get_instance ();
$m = new Mongo ();
$db = $m->Cache;
$collection = $db->pageCache;
$uri = $CI->config->item('base_url').
$CI->config->item('index_page').
$CI->uri->uri_string();
$cache_path = md5($uri);
$expire = time() + ($this->cache_expiration * 60);
$obj = array( "url" => $cache_path, "expire" => $expire ,"output" => $output);
$collection->insert($obj);
$m->close();
}
function _display_cache (&$CFG, &$URI)
{
$uri = $CFG->item('base_url').
$CFG->item('index_page').
$URI->uri_string;
$cache_path = md5($uri);
$m = new Mongo ();
$db = $m->Cache;
$collection = $db->pageCache;
$obj = $collection->findOne(array("url" => $cache_path));
if (time() >= $obj['expire'])
{
$collection->remove(array("url" => $cache_path));
$m->close();
return FALSE;
}
$this->_display ($obj['output']);
log_message ('debug', "Cache file is current. Sending it to browser.");
$m->close();
return TRUE;
}
复制代码
7、下个mongodb管理工具为url段加个索引,不然效率也不会太高{:soso_e100:} |
|