Изоляция кэша APC в многопользовательском режиме (cakephp) - PullRequest
5 голосов
/ 15 ноября 2011

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

Моя настройка:

  1. Apache 2.2
  2. Php 5,3
  3. торт 1.3.10
  4. Сервер Win 2k3

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

Проблема:

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

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

UPDATE: Проблема возникает, даже если я создаю новую копию приложения и помещаю ее в свой собственный документ !!!

UPDATE2

Сценарий 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 возможно смешивание данных client1 с клиентом 2 (очень плохо) Для сценария 2, пока я использую разные ключи кеша, я уверен, что никогда не получу путаницу?

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

Почему:

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

Обходной путь:

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

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

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

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

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

  • memcache позволяет вамдля создания кластера memcache
  • легко отделить сервер приложений от серверов кэширования (для масштабирования это огромный плюс)
  • вы отделите bytecache от кэша пользователя
  • правильно настроено оченьбезопасный (так как его iptables очень надежен
...