cakephp - 为什么在我将调试切换到3之前不会发生一些变化?

Owe*_*wen 13 cakephp

有时我会在本地实现更改并且它们工作正常,我将它们复制到我的远程Web服务器并且忽略更改.(代码完全相同.)

我进入core.php,将调试更改为3,再次检查......它有效!

我觉得这与缓存有关,但我不知道到底要改变什么.

dei*_*zel 30

CakePHP有一个缓存位于/app/tmp/cache.目录结构如下所示:

# /app/tmp/cache
# /app/tmp/cache/models
# /app/tmp/cache/persistent
# /app/tmp/cache/views
Run Code Online (Sandbox Code Playgroud)

通常遇到的主要问题是模型缓存.当调试关闭(即在生产中)并导致CakePHP调度时,它会内省所有数据库表的模式,并将它们存储在models上面文件夹中的平面文件中.如果您不删除此文件夹中的文件,CakePHP将开始说明当数据库中显然存在模型/表/字段时,它们不存在.

如果在应用程序中启用了视图缓存,那么第一次呈现视图时,CakePHP会将平面文件编译到该views文件夹,以防止在下一个请求时再次呈现这些视图.

在CakePHP的引导过程中,它必须先确定您在安装中使用的目录结构,然后才能访问重要文件(如database.php).因此,CakePHP将生成缓存文件到persistent目录,其中包含每个重要目录和文件的绝对路径,您正在使用的任何插件,甚至您创建的任何本地化,因此它可以在不重新分析.pot文件的情况下快速翻译您的应用程序.

因此,简单地说,每当您对正在生产的应用程序进行代码更改时,您必须记住删除这些目录中的所有文件,或者将其作为部署机制的一部分添加.但是,您不能删除任何目录.

将debug更改为3的原因是因为当打开调试模式(任何值大于零)时,缓存将在每个请求中被清除并重新生成,但是 - 虽然这有效 - 但它不容易自动化.

有许多方法可以以编程方式执行此操作 - 包括shell命令,CakePHP插件,Capistrano配置,Ant文件 - 但也可以手动执行此操作.

  • 是的,设置`Configure :: write('Cache.disable',true);`对于没有缓存很有用. (2认同)

Bee*_*son 6

您可能会发现这对于清除CakePHP 1.2,1.3中的缓存很有用,我认为这可以在2.x中工作(稍微修改以使用新的CakeRequest类):

    if(Configure::read('debug') > 0 and isset($this->params['url']['emptycache'])) {
        // clear Cache::write() items
        Cache::clear();
        // clear core cache
        $cachePaths = array('views', 'persistent', 'models');
        foreach($cachePaths as $config) {
            clearCache(null, $config);
        }
        $this->Session->setFlash('Cache cleared', 'default', array(), 'info');
    }
Run Code Online (Sandbox Code Playgroud)

将其添加到AppController :: beforeFilter()中.

基本上,当您处于开发模式时,上面的代码可以通过在URL中附加查询字符串来轻松清除缓存,例如mydomain.com/?emptycache - 它将删除所有Cake的缓存文件.