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

[库 Library] 页面缓存整理

[复制链接]
发表于 2009-10-7 18:00:02 | 显示全部楼层 |阅读模式
看了 xgdd1987 的有关 CI 页面缓存问题的终极解决方案感觉有一些地方不合我的想法:
1、修改了 URI 类,使其支持中文那块,实际就是修改了配置文件的 permitted_uri_chars,使安全性降低了。注释原句是:“DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!”
2、对于在子文件夹下的控制器产生的缓存也是仅有控制器名称和方法名称,这有可能造成重名的可能,如 welcome+index
我按我的思路修改的了MY_out.php,通过路径进行判断确定的文件夹或控制器名称。对于有子文件夹的缓存可以按子文件夹名称+控制器名称+方法名称生成目录。似乎最多只能有一层子文件夹,不过我这个可以不限定多少层。
有的希望对还加上传递的参数的名称命名,也可以定义。
注意:为了防止生成无效的缓存,这里定义了一个层级,当超过层级后,系统会截取指定的URI片段并跳转。
如:localhost/dir/controller/founction/param1/param2
代码:
PHP复制代码
$this->output->cache_rsegment(4,__FILE__);
$this->output->cache(1);
复制代码

加载后,系统会跳转到 localhost/dir/controller/founction/param1/,然后生成 dir+controller+founction/ 缓存文件名的缓存。
第一个参数表示希望 localhost/ 后最大的片段长度
第二个参数必须的,而且固定为 __FILE__(不知道如何在函数里获得调用该函数的目录,所以只能每次都在控制器里进行参数传递)
如果希望生成的缓存文件夹名包含一个参数
PHP复制代码
$this->output->cache_rsegment(4,__FILE__,1);
$this->output->cache(1);
复制代码

生成的缓存文件夹就是 dir+controller+founction+param1/
第三个参数表示希望缓存文件夹名称里包含几个参数名称

这个代码基本满足了我的需求,不过感觉就是使用起来不够方便,因为在生成cache之前必须要调用cache_rsegment这个函数,并且还要在控制器里调用,因为要得到控制器的__FILE__,使应用不够灵活。

昨天基本小测了一下,效果不错。大家有兴趣的可以测试下。
删除cache文件夹可以
PHP复制代码
$this->output->clear_page_cache("dir/controller/founction");
$this->output->clear_page_cache("dir/controller/founction/param");
复制代码

值删除某个cache
PHP复制代码
$this->output->clear_page_cache("dir/controller/founction","param1/param2");
复制代码


由于最近比较忙,做的比较匆忙,可能会有些bug,希望大家多讨论。

评分

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

查看全部评分

发表于 2009-10-7 21:55:02 | 显示全部楼层
感谢楼主分享自己的成果,我帮楼主改了一下语法高亮,呵呵。

删除某个缓存的功能很实用。
发表于 2009-10-8 21:10:46 | 显示全部楼层
我按楼主说的方法鼓捣了半天也没弄成功,生成的缓存还是和CI自带的一样没有变,也没有生成存放缓存的文件夹,不知道是什么原因。。。修改URI类,让它支持中文参数,我认为是把URI功能扩大了,如果不修改,你在地址栏里输入中文参数,程序就会出现这样的提示:An Error Was Encountered The URI you submitted has disallowed characters.  我认为身为中国人,写的程序就得兼容中文才行,而不是去禁止用中文。。  呵呵。。我刚才花了好长的时间,修改了一下我原来的那张帖子,希望你再去看一下。我的帖子的地址是:http://codeigniter.org.cn/forums/thread-3216-1-1.html 。还有你的这个缓存我怎么都调试不成功,希望你给我点提示。。还有,就是调用起来有点麻烦...
 楼主| 发表于 2009-10-9 21:36:15 | 显示全部楼层
楼上应该是没有先调用
$this->output->cache_rsegment(4,__FILE__,1);
参数具体怎么填写可以看上面说明。
如果没有使用上面的那句的话,效果就是CI默认的缓存效果。
如果还有不明白的再找我。
我这个调用上是有些麻烦,但是增加了安全性,可以防止恶意多传递信息,生成不必要的缓存。
发表于 2010-7-14 00:27:07 | 显示全部楼层
先收藏,回头好好研究,感觉很有用。
发表于 2010-9-4 12:19:42 | 显示全部楼层
刚我也用了一下楼主的方法,结果发现和 xgdd1987 一样,也没有生成存放缓存的文件夹。然后试了试MY_output里面的方法,瞎捣鼓出来,原来是      
PHP复制代码
$m = preg_match_all("/([\/\\\]{1})/", $y, $a) - preg_match_all("/([\/\\\]{1})/", FCPATH.APPPATH, $a) + 1;
 
复制代码
这行代码有问题,于是仔细研究了一下,原来是 正则匹配表达式有问题,改成
PHP复制代码
$m = preg_match_all("/([\/\\]{1})/", $y, $a) - preg_match_all("/([\/\\]{1})/", FCPATH.APPPATH, $a) + 1;
 
复制代码
这样就没问题了,多了个反斜杠
发表于 2010-9-4 12:21:09 | 显示全部楼层
额~~晕了~~发出去的代码被转换了~~汗呀~~
发表于 2010-9-4 12:28:24 | 显示全部楼层
额~~改过之后虽然能正确生成文件夹了,但是出现另外一个问题,就是缓存根本没用,每次刷新页面,都会重新生存缓存文件~~昏倒了~~
发表于 2010-9-4 12:50:35 | 显示全部楼层
额~~原来是   FCPATH.APPPATH这里有问题
改成APPPATH这样就能正确生成文件夹了,但是页面每次刷新都会重新生成缓存文件,郁闷呀~~不知道是什么原因~~
发表于 2010-9-4 13:24:46 | 显示全部楼层
最终发现在 _display_cache()这个方法里面取到的$this->cachedir 每次都是空的 ,所以每次刷新的时候,系统都会找不到已经按文件夹方式存储的缓存文件,所以每次都会重新生成文件。还望楼主能解决这个问题呀~~

本版积分规则