1

在 CakePHP (2.1) 应用程序中,我将主题与 cacheAction 一起使用。当访问 eg 的视图时/controller/action,它的缓存文件被保存到tmp/views/controller_action.php. 从移动 url(如m.example.com)访问相同视图时,我在内部使用具有主题视图的相同应用程序来简化移动设备的输出。

但是现在缓存有一个问题:两个请求有不同的主机名和主题,但相同的控制器/动作,因此缓存文件的文件名相同。因此,当访问具有不同主机或主题的 url 时,CakePHP 返回相同的缓存文件(或更准确地说是第一个请求的缓存文件)。无法根据参数(例如主机名或主题)更改缓存文件的名称。

我尝试修改CacheHelper的参数,但没有成功。有没有办法即时更改 CacheHelper 的缓存路径/前缀?还是有另一种可能性来实现这种行为?

4

2 回答 2

1

解决此问题的唯一解决方法是以下步骤:

1) 创建一个扩展 CacheHelper 的自己的 MyCacheHelper 并将其保存到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.

而已。有点复杂,但它按预期工作!现在您可以根据需要调整 $prefix 并为不同的域创建唯一的缓存文件。

于 2012-05-05T13:26:47.660 回答
1

更好的解决方案:CakePHP 2.3 现在支持核心配置中的缓存前缀:

Configure::write('Cache.viewPrefix', 'YOURPREFIX');

这个前缀可以适应主题名称或在这些请求中不同的一些其他参数。

于 2013-01-25T08:43:55.743 回答