2014-01-09 3 views
1

Хорошо, вот для меня новый.Нечетная проблема с корнем документа CakePHP

Вот ситуация ... У меня есть приложение Cake, работающее в нескольких средах (dev, qa, staging, live), управляемое с помощью 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

Используете ли вы APC для кеширования? У вас есть другой кеш-префикс для каждого экземпляра (т. Е. Другой кеш-префикс для dev, qa, staging и т. Д.)? –

+1

@BenHitchcock, вероятно, прав. У меня была такая же проблема при переключении хостов.Cake настроен для переключения на APC для кэширования по умолчанию, если сервер способен обрабатывать его. Это от http://book.cakephp.org/2.0/en/core-libraries/caching.html- Кэш APCCache APC использует расширение APC PHP. Это расширение использует общую память на веб-сервере для хранения объектов. Это делает его очень быстрым и способным обеспечивать атомарные функции чтения/записи. По умолчанию CakePHP в 2.0-2.2 будет использовать этот механизм кэширования, если он доступен. – JadedCore

+0

Ооо, хороший вопрос! Я об этом не думал. Я попытаюсь отключить его и посмотреть, не изменилось ли это! – Zach

ответ

1

Как отмечается в комментариях, проблема, скорее всего, связана с APC и префиксами.

Что происходит, так это то, что Cake кэширует пути различных моделей с использованием APC. Все это нормально, пока у вас не будет нескольких приложений, которые используют одни и те же данные кеша на одном сервере. Именно поэтому Cake позволяет установить префикс кэша.

Так одно решение, чтобы установить префикс в основе каждого deployoment, как это:

// 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 
    ) 
); 

Обратите внимание на инфлектор :: слизняк (ROOT) линии. Это даст каждому приложению уникальный префикс без необходимости его явно устанавливать.

+0

Спасибо за детали! Это почти так, как я его реализовал! – Zach

Смежные вопросы