Изолиране на APC кеш паметта в настройка с множество клиенти (cakephp)

Използвам cakephp за стартиране на приложение с множество клиенти. Има само 1 екземпляр на приложението, като единствената разлика е базата данни, към която се свързва всяко приложение. Освен това приложението е идентично.

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

  1. Apache 2.2
  2. Php 5.3
  3. торта 1.3.10
  4. Win 2k3 сървър

    Имам приложението, разгърнато под docroot на apache (само 1 екземпляр на приложението работи). Наскоро преминах от File към APC кеш. Файловите префикси за кеширане са еднакви и за двете приложения. Използване на виртуални хостове на Apache, за да решите към кое приложение да отидете. Кеширам статични html/js/css/gif, но не и php (чрез mod_expires на apache)

Проблем:

Забелязах, че някои от кешираните стойности, които трябваше да бъдат достъпни за APP 1, се показват в падащото меню за App 2. Бях шокиран да видя това да се случи.

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

АКТУАЛИЗАЦИЯ: Проблемът възниква дори ако направя ново копие на приложението и го поставя в собствения му docroot!!!

АКТУАЛИЗАЦИЯ 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 не знае нищо за vhosts, приложения или други "apache" неща.
  2. Това означава, че всеки кеш ключ се споделя между всички vhostове, ако 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 за вашите потребители
  • обвържете вашите vhosts/домейни със собствени IP адреси
  • стартирайте екземпляри на memcache за вашия vhost (т.е. vhost1 = порт 12345, vhost2 = порт 12346, …)
  • добавете правила за iptable, които пускат всеки пакет на конкретния memcache порт, който не съответства на вашия vhost ip за този порт)

Вашият проблем изглежда е, че php работи като fastcgi, така че всеки vhost ще получи един и същ php процес, за да сподели своя кеш. Трябва да настроите php да работи само за всеки vhost (не знам какво трябва да търсите).

Бих предпочел метода memcache, защото:

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