用户
 找回密码
 入住 CI 中国社区
搜索
查看: 6350|回复: 4
收起左侧

[优化] 扩展CI_Output,用Mongodb做CI的页面缓存

[复制链接]
发表于 2012-10-8 13:53:17 | 显示全部楼层 |阅读模式
本帖最后由 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:}
 楼主| 发表于 2012-10-8 13:58:40 | 显示全部楼层
本帖最后由 hulei0102 于 2012-10-9 08:40 编辑

mongodb vc9 for php5.3 驱动 + My_Output.php 文件
该包中已经包含了php5.2~5.4版本的mongodb驱动。
My_Output.php中有注释掉的为之前文章中,文件缓存的解决办法,大概也就只能支持100万页了,这就是文件缓存的极限。

共享软件.rar

717.57 KB, 下载次数: 73

发表于 2012-10-8 21:17:07 | 显示全部楼层
非常不错,mongodb 做缓存从来没有想过的,试试先。。。
发表于 2012-10-8 21:18:59 | 显示全部楼层
我嚓~ 居然同步到QQ微博了
发表于 2013-4-23 11:41:09 | 显示全部楼层
这个方法好像很不错,可以试试看

本版积分规则