【问题标题】:Odd issue with CakePHP Document RootCakePHP 文档根目录的奇怪问题
【发布时间】:2014-01-09 19:08:14
【问题描述】:

好的,这是我的一个新的。

情况是这样...我有一个 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 域的文件!现在,我不认为这与某种人类编码错误有关,因为它的简单修复是重新启动 Apache!

现在,我认为这可能是某种会话问题,因为我将会话存储在数据库中,但即使我清除了数据库中的所有会话(不重新启动 apache),它也无法修复它。

但是,如果我重新启动 Apache,保持会话表不变,它突然又开始工作了!

这一切对我来说似乎很奇怪,我只是不知道该去哪里找。 我尝试更改不同级别的缓存,但这并没有改变任何东西。

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

【问题讨论】:

  • 您是否使用 APC 进行缓存?每个实例是否有不同的缓存前缀(即 dev、qa、staging 等不同的缓存前缀)?
  • @BenHitchcock 可能是对的。我在切换主机时遇到了同样的问题。如果服务器能够处理,Cake 默认设置为切换到 APC 进行缓存。这是来自book.cakephp.org/2.0/en/core-libraries/caching.html-ApcCache APC 缓存使用 PHP APC 扩展。此扩展使用网络服务器上的共享内存来存储对象。这使得它非常快,并且能够提供原子读/写功能。默认情况下,2.0-2.2 中的 CakePHP 将使用此缓存引擎(如果可用)。
  • 哦,好问题!我没有想到。我会尝试将其关闭,看看是否有影响!
  • @BenHitchcock - 哇!好抓人!我相信那成功了!我不能总是重新制作它,但目前,它似乎已修复。
  • 也感谢@JadedCore 提供的信息!

标签: php apache session cakephp cakephp-2.3


【解决方案1】:

正如 cmets 中所述,该问题很可能与 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) 行。这将为每个应用程序提供一个唯一的前缀,而无需显式设置它。

【讨论】:

  • 感谢您的详细信息!这几乎就是我实现它的方式!
猜你喜欢
  • 1970-01-01
  • 2012-03-20
  • 2011-10-05
  • 2011-07-31
  • 1970-01-01
  • 2011-06-18
  • 2012-03-17
  • 1970-01-01
  • 2018-02-20
相关资源
最近更新 更多