cakephp - 为什么在我将调试切换到 3 之前某些更改不会发生?

问题描述 投票:0回答:6

有时我会在本地实施更改,它们工作正常,我将它们复制到远程网络服务器,并且更改将被忽略。 (代码是相同的。)

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

我感觉这与缓存有关,但我不知道到底要更改什么。

php cakephp
6个回答
31
投票

CakePHP 有一个缓存位于

/app/tmp/cache
。目录结构如下所示:

# /app/tmp/cache
# /app/tmp/cache/models
# /app/tmp/cache/persistent
# /app/tmp/cache/views

通常遇到的主要问题是模型缓存。当调试关闭(即在生产中)并且您导致 CakePHP 调度时,它会内省所有数据库表的架构,并将它们存储在上面的

models
文件夹中的平面文件中。如果您不删除此文件夹中的文件,CakePHP 将开始说模型/表/字段不存在,而它们在您的数据库中显然存在。

如果您在应用程序中启用视图缓存,则当第一次渲染视图时,CakePHP 会将平面文件编译到

views
文件夹,以防止在下一个请求时再次渲染这些视图。

在 CakePHP 的引导过程中,它必须先确定您在安装中使用的目录结构,然后才能访问重要文件(如

database.php
)。因此,CakePHP 将在
persistent
目录中生成缓存文件,其中包含每个重要目录和文件、您正在使用的任何插件甚至您创建的任何本地化的绝对路径,以便它可以快速在语言之间翻译您的应用程序,而无需重新解析
.pot
文件。

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

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

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


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');
    }

将其添加到您的 AppController::beforeFilter() 中。

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


2
投票

这绝对是缓存。在服务器端,如果启用了缓存,就不要怀疑缓存是否发生。您可以在 core.php 中关闭此功能,或者更有可能在升级应用程序时清除缓存

Cache::clear()
。在客户端,您可能需要调整浏览器以完全禁用缓存。


1
投票

我认为这是一个客户端问题。您是否安装了 Firefox Mozilla 的Web Developer 插件?如果是,您可以轻松地停用客户端的缓存以进行检查。

如果您更改调试级别,它会再次工作,因为 url 和 cookie 数据可能略有不同,导致从服务器重新加载。如果还是不行那么一定是服务器端缓存的问题...

注意:除此之外,您还可以使用该插件为 Web 开发做各种有用的事情,例如动态修改 css 或将样式可视化为页面上的叠加层。


1
投票

我遇到了同样的问题,deizel 给出了很好的解释,只是想补充一点,如果您不进行大量更改,那么简单的方法(无需删除或删除缓存数据或类似的事情)就是更改调试级别从 0 到 3,刷新页面,对 po 文件进行更改,然后再次将调试设置为 0。


1
投票

我找到了很好的解决方案这里。我认为它应该是完美的并且工作正常。解决方案如下:

function _clear_cache()
    {

        Cache::clear();
        clearCache();

        $files = array();
        $files = array_merge($files, glob(CACHE . '*')); // remove cached css
        $files = array_merge($files, glob(CACHE . 'css' . DS . '*')); // remove cached css
        $files = array_merge($files, glob(CACHE . 'js' . DS . '*'));  // remove cached js
        $files = array_merge($files, glob(CACHE . 'models' . DS . '*'));  // remove cached models
        $files = array_merge($files, glob(CACHE . 'persistent' . DS . '*'));  // remove cached persistent

        foreach ($files as $f) {
            if (is_file($f)) {
                try {
                    @unlink($f);
                } catch (Exception $ex) {
                    $files['errors'][] = $ex->getMessage();
                }
            }
        }

        if (function_exists('apc_clear_cache')):
            apc_clear_cache();
            apc_clear_cache('user');
        endif;

        return $files;

    }

只需在您的appcontroller中使用上述函数并在您想要的位置运行该函数即可清除所有缓存。

© www.soinside.com 2019 - 2024. All rights reserved.