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

[核心代码 Core] 有关CI页面缓存问题的终极解决方案

  [复制链接]
发表于 2009-9-20 16:34:08 | 显示全部楼层 |阅读模式
本帖最后由 xgdd1987 于 2009-10-8 21:12 编辑

CI框架的页面缓存一直是令CI爱好者非常头疼的一件事,我也是深受其困。。前段时间终于下定决心,要扩展一下,有幸调试成功。。我在这里就和大家分享一下吧。。

       CI的页面缓存能自动生成,如果页面有变动但是却不能把缓存及时删除。现在我扩展的这个功能,可以随时自动生成缓存,也可以随时调用函数来删除它,这样就不用为缓存不能急时删除而头疼了。。。废话不在多说,进入正题:

    这里要扩展两个东西,一个是My_Output.php,一个是My_URI.php,把这两个文件(去我的附件里下载即可)放到system/application/libraries下即可(注意:文件名请不要改..)

    然后就是修改system/application/config/config.php,找到$config['cache_path'] ='';把它替换成$config['cache_path'] = 'system/cache/page/';
最后在system/cache下建立一个page文件夹,这样就能扩展成功了。。

       使用的时候,在你的控制器里载入页面之前调用$this->output->cache(n)即可。。例如在welcome控制器的index()方法中写入$this->output->cache("3600"),参数是你想要缓存保存的多长时间,单位分钟...然后它就会在system/cache/page下生成一个以控制器和方法名 命名的文件夹welcome+index,在这个文件夹里就是生成的缓存文件...
       如果你想要删除某个页面的缓存,调用$this->output->clear_page_cache("参数");参数是你调用的控制器的名字+方法名;例如我们想要删除上面生成的system/cache/page/welcome+index文件夹下的缓存,直接调用$this->output->clear_page_cache("welcome/index");(注意:中间用“/”隔开);

     到这里你就可以随心所欲的操控页面缓存了,是不是很 高兴啊,赶快去试一下吧。。我在这里再提示一下,如果你也启用了数据库缓存的话,这样一来可能声成的缓存文件有点乱,建议你在system/cache/下,建立一个和page文件夹并列的文件家,用来存储数据库缓存..别忘了修改config.php啊.. 大家如果还有什么不明白的,欢迎来咨询。。。

                                                                              --BY  文秀小夏

     因为国庆节放假,我也好几天没来登录过了。。网友crgod 对我的这篇贴子发表了不同的看法,我也着重重新研究了一下,发现确实有不足之处 ,在这里我向他表示感谢。。经过我的努力之后,修正了以前的小问题。。现在的页面缓存,在处理分页时,可以把分页放在同一文件夹下(同一控制器+方法名下的分页),删除缓存的时候,可以连同生成存放缓存的文件夹一并删除...程序我已经重新上传了,请大家放心下载即可...
       使用的时候大家可以按我上面介绍的方法正常配置即可。。我在这里提醒大家一个小问题,在CI文档中说$this->output->cache(n)这句代码可以放到方法的任何地方,本人以为不大好。。我认为在你的方法得到数据库的查询结果时,判断一下结果集是否为空,当不为空时在加入这行代码:$this->output->cache("3600");然后载入视图即可。。这样做的好处是,只有得到结果集后才生成缓存,避免了人为的恶意在浏览器里输入参数生成大量缓存。。。 好了,就到这里了,如有不当之处,请大家再次提出批评,多多指教啊。。。
                                                                             --BY  文秀小夏

评分

参与人数 1威望 +5 收起 理由
Hex + 5 原创内容

查看全部评分

 楼主| 发表于 2015-5-20 13:49:50 | 显示全部楼层
欧阳皓东 发表于 2015-5-19 14:24
请问可以加您的QQ么,有些问题想跟您请教一下。我的QQ是576316088

天哪,09年的帖子,现在又被翻出来了。。。
发表于 2018-4-7 13:49:08 | 显示全部楼层
crgod 发表于 2009-10-9 21:06
额,刚给你打了半天回复内容,一个误操作全没了。重打
最近没上线,刚看了你给我回的帖子,吓了我一跳: “ ...

我这里会提示Fatal error: Call to undefined method CI_Output::cache_rsegment(),这个问题啊。是我哪里还需要配置吗?我把这两个文件都放进liararies下面了的啊。。。
发表于 2018-4-7 13:11:40 | 显示全部楼层
我这里按照你的步骤进行缓存地址的配置,也把这两个文件放在了响应的目录下。但是在welcome的index输出前,进行缓存,但是缓存的文件名师字母和数字的结合呢,并没有产生你说的文件名。这是哪里不对吗????
发表于 2009-9-20 17:38:01 | 显示全部楼层
   看看先!!!!
发表于 2009-9-20 18:27:25 | 显示全部楼层
刚测试过.
嗯 .不错.
不过
生成后
welcome+y3/464f68fe028b0acaaa408f06ec89c282
不能自动删除文件夹 只能删除文件
welcome+y3
发表于 2009-9-20 18:47:21 | 显示全部楼层
感谢 ,下来研究下
发表于 2009-9-20 20:46:52 | 显示全部楼层
CI的缓存最大的问题不是这个问题,你可以看看论坛里一篇利用缓存攻击的文章,那才是最大的问题,你的这个办法很不错,但说“终极方案”可能不妥。
发表于 2009-9-20 20:47:31 | 显示全部楼层
不过很支持楼主的原创作品!!!
 楼主| 发表于 2009-9-21 07:51:47 | 显示全部楼层
本帖最后由 xgdd1987 于 2009-9-21 07:55 编辑

3# sky8652
能连同它生成的文件夹都删除了,这个是我自己测试过的,你看看你是不是哪写的不对。呵呵。。
 楼主| 发表于 2009-9-21 07:54:50 | 显示全部楼层
5# sinopf

我知道有的人利用缓存攻击,我写的这个已经避免这个问题了,不信你可以研究一下我的代码,或是利用缓存攻击一下,它是不会产生大量的垃圾缓存的。。呵呵。。。
发表于 2009-9-21 11:11:31 | 显示全部楼层
嗯 。。可以删除,,,
不过不会过期自动删除缓存文件!。。。。。
发表于 2009-9-21 11:52:18 | 显示全部楼层
过期自动删除?谁都没实现吧?过期的缓存会在下次打开的时候自动更新!

本版积分规则