好的,这对我来说是新的。
情况就是这样......我有一个在多个环境(dev,qa,staging,live)下运行的Cake应用程序,使用GIT进行管理。
我正在开发我的开发分支,并从dev.BLAH.com访问该分支。 DEV由/var/www/dev.BLAH.com/app
提供偶尔,在处理DEV时,我会开始收到这样的错误:
Warning (512): Model "Exercise" is not associated with model "ExerciseOutcome" [/var/www/QA.BLAH.com/lib/Cake/Model/Behavior/ContainableBehavior.php, line 344]
注意:该错误是由于它正在尝试查找关联而引起的 这还没有建立在QA环境下,所以它不是关于缺失的关联,而是关于错误的路径。
显然,由于某些未知原因,DEV域正在尝试从QA域提供文件!现在,我不认为这与某种人类编码错误有关,因为简单的FIX就是重启Apache!
现在,我认为它可能是某种会话问题,因为我在数据库中存储会话,但即使我清除了数据库中的所有会话(没有重新启动apache),它也无法修复它。
但是,如果我重新启动Apache,保持会话表不变,它会突然重新开始工作!
这对我来说似乎很奇怪,我只是不知道还有什么要看。 我尝试改变各种级别的缓存,但这并没有改变任何东西。
我不认为我是个白痴,但我希望有人可以证明我错了! ;)
答案 0 :(得分:1)
如评论中所述,该问题最有可能与APC和前缀有关。
Cake会使用APC缓存各种模型的路径。在您有多个应用程序在一台服务器上使用相同的缓存数据之前,这一切都很好。这就是Cake允许您设置缓存前缀的原因。
因此,一种解决方案是在每个部署的基础上设置前缀,如下所示:
// Prefix each application on the same server with a different string, to avoid Memcache and APC conflicts.
$prefix = 'myapp_DEV_';
但是,当您使用源代码管理并希望各种部署尽可能彼此接近时,这会变得混乱。
我解决它的方法是修改APP / Config / core.php中的缓存配置,如下所示:
/**
* Configure the cache used for general framework caching. Path information,
* object listings, and translation cache files are stored with this configuration.
*/
Cache::config(
'_cake_core_',
array(
'engine' => $engine,
'prefix' => $prefix . 'cake_core_' . Inflector::slug(ROOT),
'path' => CACHE . 'persistent' . DS,
'serialize' => ($engine === 'File'),
'duration' => $duration
)
);
注意 Inflector :: slug(ROOT)行。这将为每个应用程序提供唯一的前缀,而无需明确设置它。