На одном сервере живёт основной сайт (на CakePHP) и отдельно его тестовая версия, то есть полная копия с некоторыми изменениями в процессе разработки. Так вот при включении Apc или XCache оно кэширует, например, класс контроллера сайта, к которому первым обратились, после чего второй сайт начинает работать точно так же, то есть используется класс из кэша первого.
Неужели оно кэширует классы, не обращая внимания, что у них разные полные пути? Что с этим делать?
APC может показывать списки закешированных файлов через web-интерфейс (в поставке идет apc.php).
Сравните списки в плане пути до контроллера при обращении к сайтам по очереди, со сбросом кеша между проверками.
Посмотрел, теперь вообще ничего не понимаю. Apc не видит часть каталогов (со всеми скриптами внутри) сайта, к которому обращение произошло не первым после перезапуска сервера (сброк кэша не влиет). То есть перезапускаю апач, иду на основной сайт, вижу в списке каталогов /var/www/html/production/app/controllers, ну и, например /var/www/html/production/app/config и прочие. Иду на тестовый сайт, обновляю страницу Apc, вижу появился в списке /var/www/html/test/app/config, а /var/www/html/test/app/controllers нету и обращения с его точки зрения идут к /var/www/html/production/app/controllers, даже если хожу на тестовый сайт. Если перезапустить апач и зайти первым на тестовый, то будет наоборот. Стоит обычный апач с мод_пхп, ничего больше хитрого. Как такое вообще может быть… Да, если поставить apc.enabled=0 то всё работает без проблем.
Не сталкивался с подобным.
Вот тут написано в общем-то очевидное:
APC caches based on the path to the class, not just the class name. So as long as each of your versions have their own copy of the class you shouldn't have any problems.
А у вас файлы с классами контроллеров подгружаются с полными путями? Может это какой баг вашей версии APC, где в качестве ключа кеша выступает путь «как есть», а не полный путь от корня.
Возможно, CackePHP кэширует значения переменных, а не только файлы. Например список контроллеров, их параметры. Попробуйте поменять префиксы, по идее должны быть в настройках.