关于页面缓存的疑问

恶意请求对它是没影响的(无论是否恶意请求,你都需要schema cache来提高性能)。

这样我知道,问题是如果我开启schema cache后,采用页面缓存的话,每个请求他都会生成一个文件。我的机器上不支持memcache和apc,所以我只能用文件来存了。

你这么一说我又有疑问了。

1.假如我在config中设置了’schemaCachingDuration’=>3600, 而我不采用任何一种缓存方式,是不是这个schema 缓存就不会生效啊?他是不是必须依赖于某种缓存方式吧?

2.我把配置里的’keyPrefix’=>$_SERVER[REQUEST_URI],去掉了,然后在controller里的filter里的COutputCache 加上参数’varyByParam’=>array(‘id’,‘pid’,‘sid’),(我不同的模块可能不同的id名字,像pid,sid等,是不是依次放到数组中呢?)这样的话,我访问id的那些页面,可以依据不同id分别缓存,而访问pid的页面,结果只缓存了一个页面?这是怎么回事呢?

  1. 回到上面我我一直在问的问题,我在一个controller的上下文中,如何知道本页面缓存的key呢?因为我希望可以控制它。

首先把’keyPrefix’=>$_SERVER[REQUEST_URI]去掉。这样schema cache的文件数只和table数有关,它是不依赖于请求的。

schema cache必须使用ID为’cache’的缓存组件。如果你没有设置,那么schema cache是不会起作用的。

前面我说过,cache key的计算是很复杂的。它取决于很多因素,包括当前访问的controller id, action id, varyByParam里设定的GET参数等等。所以不要试图去取到它控制它。它是由COutputCache自己管理的。

至于varyByParam里放什么,取决于你的页面参数。如果某个页面是随id变化的,那么对应的varyByParam就应该是id。如果它根据两个参数变化,那么就需要把两个参数同时列上。如果你有不同的页面它们的变动参数不一样,那么你需要多个COutputCache,每个对应一个页面。如果多个页面用的都是相同名字的参数,那么一个COutputCache就可以了。

那天熬到4点,大伤元气,忘了道谢,您的答复我清楚了。谢谢!

很有用的一个帖子