有时我会在本地实施更改,它们工作正常,我将它们复制到远程网络服务器,并且更改将被忽略。 (代码是相同的。)
我进入 core.php,将调试更改为 3,再次检查...它有效!
我感觉这与缓存有关,但我不知道到底要更改什么。
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 文件 - 但也可以手动执行此操作。
您可能会发现这对于清除 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 的所有缓存文件。
这绝对是缓存。在服务器端,如果启用了缓存,就不要怀疑缓存是否发生。您可以在 core.php 中关闭此功能,或者更有可能在升级应用程序时清除缓存
Cache::clear()
。在客户端,您可能需要调整浏览器以完全禁用缓存。
我认为这是一个客户端问题。您是否安装了 Firefox Mozilla 的Web Developer 插件?如果是,您可以轻松地停用客户端的缓存以进行检查。
如果您更改调试级别,它会再次工作,因为 url 和 cookie 数据可能略有不同,导致从服务器重新加载。如果还是不行那么一定是服务器端缓存的问题...
注意:除此之外,您还可以使用该插件为 Web 开发做各种有用的事情,例如动态修改 css 或将样式可视化为页面上的叠加层。
我遇到了同样的问题,deizel 给出了很好的解释,只是想补充一点,如果您不进行大量更改,那么简单的方法(无需删除或删除缓存数据或类似的事情)就是更改调试级别从 0 到 3,刷新页面,对 po 文件进行更改,然后再次将调试设置为 0。
我找到了很好的解决方案这里。我认为它应该是完美的并且工作正常。解决方案如下:
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中使用上述函数并在您想要的位置运行该函数即可清除所有缓存。