收藏本站 Archiver
    请 后使用快捷导航
    没有账号?入住 CI 中国社区
    查看: 45368|回复: 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 | 只看该作者
    不过很支持楼主的原创作品!!!
    7
    楼主| 发表于 2009年9月21日 07:51:47 | 只看该作者
    本帖最后由 xgdd1987 于 2009年9月21日 07:55 编辑

    3# sky8652
    能连同它生成的文件夹都删除了,这个是我自己测试过的,你看看你是不是哪写的不对。呵呵。。
    8
    楼主| 发表于 2009年9月21日 07:54:50 | 只看该作者
    5# sinopf

    我知道有的人利用缓存攻击,我写的这个已经避免这个问题了,不信你可以研究一下我的代码,或是利用缓存攻击一下,它是不会产生大量的垃圾缓存的。。呵呵。。。
    9
    发表于 2009年9月21日 11:11:31 | 只看该作者
    嗯 。。可以删除,,,
    不过不会过期自动删除缓存文件!。。。。。
    10
    发表于 2009年9月21日 11:52:18 | 只看该作者
    过期自动删除?谁都没实现吧?过期的缓存会在下次打开的时候自动更新!
    下一页 »
    12 3 4 5 6 下一页
    返回列表
    您需要登录后才可以回帖 登录 | 入住 CI 中国社区

    本版积分规则

    AltStyle によって変換されたページ (->オリジナル) /