在CakePHP(2.1)应用程序中,我将主题与cacheAction一起使用。当访问例如/controller/action
,其缓存文件已保存到tmp/views/controller_action.php
。从移动网址(如m.example.com
)访问同一视图时,我在内部使用带有主题视图的相同应用来简化移动设备的输出。
但是现在缓存存在问题:两个请求都有不同的主机名和主题,但是控制器/操作相同,因此缓存文件的文件名相同。因此,当访问具有不同主机或主题的URL时,CakePHP返回相同的缓存文件(或更准确地说是第一个请求的缓存文件)。根据参数(例如主机名或主题),无法更改缓存文件的名称。
我尝试修改CacheHelper的参数,但没有成功。有没有办法动态更改CacheHelper的缓存路径/前缀?还是有另一种可能实现这种行为吗?
答案 0 :(得分:1)
解决此问题的唯一解决方法是以下步骤:
1)创建一个自己的MyCacheHelper,扩展CacheHelper并将其保存到app/View/Helper/CacheHelper.php
。覆盖方法_writeFile()
并使用前缀扩展$ path字符串的行:
App::uses('Helper', 'Cache');
class MyCacheHelper extends CacheHelper
{
public function _writeFile($content, $timestamp, $useCallbacks = false)
{
// ...
$cache = $prefix.strtolower(Inflector::slug($path));
// ...
}
}
2)创建一个自己的MyDispatcher,扩展Dispatcher并将其保存到app/Lib/Routing/MyDispatcher.php
。覆盖方法cached()
并使用前缀扩展$ path字符串的行:
App::uses('Dispatcher', 'Routing');
class MyDispatcher extends Dispatcher
{
public function cached($path)
{
// ...
$path = $prefix.strtolower(Inflector::slug($path));
// ...
}
}
3)更改文件app/webroot/index.php
以使用新的调度程序:
App::uses('MyDispatcher', 'Routing');
$Dispatcher = new MyDispatcher();
4)更新控制器中的$helper
参数,使用MyCache
代替Cache
。
就是这样。有点复杂,但它按预期工作!现在,您可以根据需要调整$前缀,并为例如创建唯一的缓存文件。不同的领域。
答案 1 :(得分:1)
更好的解决方案:CakePHP 2.3现在支持核心配置中的缓存前缀:
Configure::write('Cache.viewPrefix', 'YOURPREFIX');
可以调整此前缀以匹配主题名称或这些请求中不同的其他一些参数。