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

[优化] 智能CI页面缓存-CI 页面缓存的改进

[复制链接]
发表于 2011-10-12 15:02:39 | 显示全部楼层 |阅读模式
本帖最后由 zhengfeity 于 2011-10-12 15:49 编辑

上次发的帖子 有点不太好 我这次改了以后算一个最后的解决方案吧
首先搞清楚CI的机制 首先访问 找缓存文件 然后找不到在检查 生成 济南做网站五角星网络科技提供
先来说说
第一 假设我们有很多文档,比如1000000 很庞大的数字 放在一个目录下会很卡 即使不卡 这么文档同时更新缓存也是不小的事  文档的内容一般都是 更改的时候显示也就更改了 所以这个文档的缓存应该设成永久!仿照DZ头像存储的路径我这写了一个路径保存方案000/000/000/缓存文件
第二 分页同上 但是分页还有个不同之处 更新一篇文档 有1000页 那么这1000个文件都得更新 更新1000个文档负担还是比较小的
所以文章类别控制在1000页 之内 大于1000页的话 按1000算 站在SEO的角度 这个列表必须更新 而文档被收录的话可以不存在于列表中  只要百度能打开你的已收录的内页 那么就基本不会掉
第三 既然是智能缓存 那么肯定有缺陷某些控制器不想被缓存 比如后台 那么我就可以把这个文件夹 移除缓存的范围

改进CI页面缓存 $this->output->cache(0);   这个是永不清空缓存文档

目录结构是 控制器名  方法名 层层递进 当碰到数字的话结束 也就是后面的000/000/000/缓存文件


下面贴点代码  system/croe/output.php
PHP复制代码
if ($this->cache_expiration >= 0 && isset($CI) && ! method_exists($CI, '_output'))
                {
                        $this->_write_cache($output);
                }
复制代码

这一行是在_display  更改就是把大于0 改成大于等于0
PHP复制代码
$uri =         $CI->uri->uri_string();
                $check = explode("/",$uri);
                require('./settings/siteset.php');
                if($check[0] == $config['adminmenu'])
                {
                        return;exit();
                }
复制代码


这段代码就是屏蔽 不缓存的目录 自己可以更改
PHP复制代码
//扩展缓存路径
        function _cache_path($url,$uri_string)
        {
                $check = explode("/",$uri_string);
                require('./settings/siteset.php');
                if($check[0] == $config['adminmenu'])
                {
                        return;exit();
                }
                foreach($check as $key)
                {
                       
                        if(!is_numeric($key))
                        {
                                $url = $url.$key."/";
                                $this->_mkdir_dir($url);
                        }
                        else
                        {
                                $url = $this->_calculate($url,$id);
                                return $url;exit();
                        }
                }
                return $url;
        }function _mkdir_dir($url)
        {
                if(!is_dir($url))
                {
                        if(@!mkdir($url))
                        {
                                log_message('debug', "缓存目录无法创建");exit();
                        }
                }
        }
        function _calculate($url,$id)
        {
                return $url.$this->_get_dir($url,$id);        
        }
        function _get_dir($url,$id)
        {
               
                $str1 = $id/1000000000;
                $str = floor($str1);
                $a1 = str_pad($str,3,"0",STR_PAD_LEFT);
                $this->_mkdir_dir($url.$a1);
               
                $id1 = $id%1000000000; //第一层余数
               
                $str2 = $id1/1000000;
                $str = floor($str2);
                $a2 = str_pad($str,3,"0",STR_PAD_LEFT);
               
                $id2= $id1%1000000; //第二层余数
                $this->_mkdir_dir($url.$a1."/".$a2);
               
                $str3 = $id2/1000;
               
                $str = floor($str3);
                $a3 = str_pad($str,3,"0",STR_PAD_LEFT);
                $this->_mkdir_dir($url.$a1."/".$a2."/".$a3);
                return $a1."/".$a2."/".$a3."/";
        }
复制代码



然后自己更改下_write_cache() 和_display_cache 的目录 要不生成目录不对
我这里是这样写的

PHP复制代码
$cache_path = $this->_cache_path($cache_path,$CI->uri->uri_string());
                $cache_path .= md5($uri);
复制代码
PHP复制代码
$cache_path = $this->_cache_path($cache_path,$URI->uri_string);
               
                $filepath = $cache_path.md5($uri);
复制代码


删除缓存 获取到这路径 找到删除即可

文档更新的时候 只更新自己的缓存 如果是目录更新的话的 那么就把这个栏目对应的列表的缓存 删除即可






发表于 2011-10-12 17:25:19 | 显示全部楼层
感谢分享,楼主辛苦了!
发表于 2011-10-12 17:55:42 | 显示全部楼层
济南做网站 用.do来骗人家你的站是JSP的。太坏了。
 楼主| 发表于 2011-10-12 21:24:16 | 显示全部楼层
斯达客 发表于 2011-10-12 17:55
济南做网站 用.do来骗人家你的站是JSP的。太坏了。

CI的好处呵呵 啥叫骗人啊 下面写着基于codeigniter  呵呵
发表于 2011-10-13 09:49:47 | 显示全部楼层
zhengfeity 发表于 2011-10-12 21:24
CI的好处呵呵 啥叫骗人啊 下面写着基于codeigniter  呵呵

开玩笑的大哥。我所谓的骗人呢是指你的那个网站网页后缀名是".do"像JSP的网站一样,不懂的人看到还真以为是JSP的脚本的网站呢 呵呵
发表于 2011-10-13 17:36:24 | 显示全部楼层
ls的好天真。这就是软文好吗。
发表于 2011-10-27 15:13:36 | 显示全部楼层
修改核心类了啊……
建议使用MY_扩展
发表于 2011-10-27 21:11:40 | 显示全部楼层
linux CENT OS,不能应用CI缓存,是啥原因啊
发表于 2011-12-7 13:32:31 | 显示全部楼层
本帖最后由 benfeng 于 2011-12-7 13:32 编辑

打开http://www.5jstar.net/
提示:Disallowed Key Characters.
发表于 2011-12-7 13:39:09 | 显示全部楼层
415x239_MarkMan.png

本版积分规则