Изоляция кеша APC в мультитентной настройке (cakephp)

Я использую cakephp для запуска многопользовательского приложения. Существует только 1 экземпляр приложения, единственная разница заключается в базе данных, к которой подключается каждое приложение. В остальном приложение идентично.

Моя установка:

  1. Апач 2.2
  2. 5.3
  3. торт 1.3.10
  4. вин 2к3 сервер

    У меня есть приложение, развернутое под docroot apache (работает только 1 экземпляр приложения). Недавно я переключился с файла на кеш APC. Префиксы файлов для кэширования одинаковы для обоих приложений. Использование виртуальных хостов Apache, чтобы решить, к какому приложению перейти. Я кеширую статические html/js/css/gif, но не php (через mod_expires apache)

Проблема:

Я заметил, что некоторые из кэшированных значений, которые должны были быть доступны для ПРИЛОЖЕНИЯ 1, отображались в раскрывающемся списке для Приложения 2. Я был потрясен, увидев, что это произошло.

Как я могу добавить изоляцию на уровне кэша APC между приложениями?

ОБНОВЛЕНИЕ: проблема возникает, даже если я создаю новую копию приложения и помещаю ее в собственный корневой каталог!!!

ОБНОВЛЕНИЕ 2

Сценарий 1) 1 экземпляр со всеми параметрами химической завивки/гребенки

Если у меня есть php-код, например

if(client=="client1") {
$options = array(opt1,opt2);
}else if(client=="client2") {
$options = array(opt3,opt4);
}

и этот код используется как клиентом 1, так и клиентом 2, как на это повлияет кэширование APC?

Сценарий 2) 2 экземпляра, каждый из которых настроен для каждого клиента

client1.php
$options = array(opt1,opt2);

client2.php
$options = array(opt3,opt4);

как это влияет на кэш APC? Если я правильно понимаю, для сценария 1 возможно смешивание данных клиента 1 с клиентом 2 (очень плохо). Для сценария 2, если я использую разные ключи кеша, я уверен, что никогда не будет смешивания?


person aks    schedule 15.11.2011    source источник


Ответы (2)


Почему:

  1. APC ничего не знает о виртуальных хостах, приложениях и других «апачских» вещах.
  2. Это означает, что любой ключ кэша является общим для всех виртуальных хостов, если apc является общим. (Что вы обычно хотите).
  3. APC не имеет собственного уровня изоляции.

Временное решение:

  1. Дайте каждому приложению собственный префикс для ключей кеша. Это позволяет им получать доступ к ключам отдельных ключей кэша пользователей. (Самый простой)
  2. Следуйте рабочему процессу breiti с memcached, если вам нужна настоящая изоляция. (Возможно лучшее решение)
  3. Вы можете запустить для каждого отдельного виртуального хоста уникальный файл PHP.ini и уникальный fcgiwrapper (см.: http://chrisgilligan.com/wordpress/apc-cache-considerations-for-virtual-hosting-environments/). Однако это означает значительное увеличение использования памяти. (Если вы действительно хотите это решение)
person Arend    schedule 15.11.2011

Один из способов может быть:

  • используйте memcached вместо APC для ваших пользователей
  • привязать свои виртуальные хосты/домены к собственным IP-адресам
  • запустить экземпляры memcache для вашего виртуального хоста (т. е. vhost1 = порт 12345, vhost2 = порт 12346, …)
  • добавьте правила iptable, которые отбрасывают каждый пакет на определенный порт memcache, который не соответствует вашему IP-адресу виртуального хоста для этого порта)

Похоже, ваша проблема в том, что php работает как fastcgi, поэтому каждый виртуальный хост получит один и тот же процесс php для совместного использования своего кеша. Вам нужно настроить php для запуска только для каждого виртуального хоста (не знаю, что вам нужно искать).

Я бы предпочел метод memcache, потому что:

  • memcache позволяет создать кластер memcache
  • легко отделить ваш сервер приложений от кеширующих серверов (для масштабирования это огромный плюс)
  • вы отделяете bytecache от пользовательского кеша
  • правильная конфигурация очень безопасна (поскольку его iptables очень надежен
person breiti    schedule 15.11.2011
comment
Спасибо за идею memcache для IP:port, но как насчет кеша кода операции? - person aks; 16.11.2011