hulei0102 发表于 2012-10-8 13:53:17

扩展CI_Output,用Mongodb做CI的页面缓存

本帖最后由 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我找来找去也只有这一个,没法子!
废话不多说上代码{:1_1:},以下配置及代码适用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个函数

      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:}

hulei0102 发表于 2012-10-8 13:58:40

本帖最后由 hulei0102 于 2012-10-9 08:40 编辑

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

ゞ放飛@夢想. 发表于 2012-10-8 21:17:07

非常不错,mongodb 做缓存从来没有想过的,试试先。。。

ゞ放飛@夢想. 发表于 2012-10-8 21:18:59

我嚓~ 居然同步到QQ微博了

MYCODEIGNITER 发表于 2013-4-23 11:41:09

这个方法好像很不错,可以试试看
页: [1]
查看完整版本: 扩展CI_Output,用Mongodb做CI的页面缓存