CakePHP Document Root的奇怪问题

时间:2014-01-09 19:08:15

标签: php apache session cakephp cakephp-2.3

好的,这对我来说是新的。

情况就是这样......我有一个在多个环境(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,保持会话表不变,它会突然重新开始工作!

这对我来说似乎很奇怪,我只是不知道还有什么要看。 我尝试改变各种级别的缓存,但这并没有改变任何东西。

我不认为我是个白痴,但我希望有人可以证明我错了! ;)

1 个答案:

答案 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)行。这将为每个应用程序提供唯一的前缀,而无需明确设置它。

相关问题