Хорошо, вот для меня новый.
Вот ситуация … У меня есть приложение 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, оставив таблицу сеансов нетронутой, он снова начнет работать снова!
Мне все это кажется таким странным, что я просто не знаю, где еще искать. Я попытался изменить различные уровни кэширования, но это ничего не изменило.
Я не думаю, что я идиот, но я надеюсь, что кто-то может доказать, что я неправ! 😉
Как отмечается в комментариях, проблема, скорее всего, связана с 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) . Это даст каждому приложению уникальный префикс без необходимости его явно устанавливать.