2011-11-15 15 views
5

Sto utilizzando cakephp per eseguire un'applicazione multi-tenant. C'è solo 1 istanza dell'app, l'unica differenza è il database a cui ogni app si connette. Oltre a questo, l'app è identica.Isolamento della cache APC in un'impostazione multi-tenant (cakephp)

La mia configurazione:

  1. Apache 2.2
  2. PHP 5.3
  3. torta 1.3.10
  4. 2k3 Win

    ho l'applicazione schierato sotto docroot di Apache (solo 1 istanza di l'app è in esecuzione). Di recente sono passato da File a cache APC. I prefissi dei file per la memorizzazione nella cache sono gli stessi per entrambe le app. Utilizzo degli host virtuali Apache per decidere a quale applicazione andare. Sto caching statico html/js/css/gif ma non php (via mod_expires di apache)

Problema:

ho notato che alcuni dei valori memorizzati nella cache che avrebbero dovuto essere a disposizione di APP 1 stava mostrando nel menu a discesa per l'app 2. Sono rimasto scioccato nel vedere questo accadere.

Come è possibile aggiungere l'isolamento nel livello di cache APC tra le app?

UPDATE: problema si verifica anche se faccio una nuova copia della app e metterlo nel proprio docroot !!!

UPDATE2

Scenario 1) 1 istanza che ha tutte perm/pettine

Se ho codice php come

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

e questo codice è condiviso da entrambi i client 1 e client 2, in che modo la memorizzazione nella cache di APC influisce su questo?

Scenario 2) 2 esempio ciascuna personalizzata per cliente

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

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

modo questo influisce cache di APC? Se ho capito bene, per lo scenario 1, è possibile avere un mix di dati client1 con client 2 (molto cattivo) Per lo scenario 2, purché utilizzi chiavi di cache diverse, sono sicuro di non avere mai un mixup?

risposta

1

Un modo potrebbe essere:

  • uso memcached invece di APC per gli utenti
  • vincolare il proprio vhosts/domini di possedere IP
  • avviare istanze memcache per il vostro vhost (vale a direvhost1 = porta 12345, vhost2 = porta 12346, ...)
  • aggiungere regole iptable che cadono ogni pacchetto sulla specifica porta memcache che non corrisponde il tuo IP vhost per quella porta)

Il tuo problema sembra essere, che php funziona come fastcgi, in modo che ogni vhost abbia lo stesso processo php per condividere la propria cache. È necessario impostare php per l'esecuzione solo per ogni vhost (non so per cosa devi cercare).

io preferirei il metodo memcache perché:

  • memcache consente di creare un cluster memcache
  • è facile separare il server applicazioni dai server di caching (per il ridimensionamento questo è un vantaggio enorme)
  • si separato bytecache dalla cache utente
  • correggere le configurato molto sicuro (come i suoi iptables è molto affidabile
+0

Grazie per il memcache per IP: idea di porta, ma per quanto riguarda la cache di opcode? – aks

2

Il perché:

  1. APC non sa nulla di vhosts, applicazioni o altre cose "Apache".
  2. Ciò significa che qualsiasi chiave cache è condivisa tra tutti i vhost se apc è condiviso. (Che di solito vuoi).
  3. APC non ha il proprio livello di isolamento.

Soluzione:

  1. Dare ad ogni applicazione che possiedono prefisso per chiavi della cache. Ciò consente loro di accedere ai tasti delle chiavi della cache dell'utente. (Più semplice)
  2. Segui il flusso di lavoro di breiti con memcached se hai bisogno di un vero isolamento. (Probabilmente la soluzione migliore)
  3. Puoi considerare di eseguire per ogni singolo host virtuale un PHP.ini e un fcgiwrapper unici (vedi: http://chrisgilligan.com/wordpress/apc-cache-considerations-for-virtual-hosting-environments/). Ciò significa tuttavia un aumento elevato dell'utilizzo della memoria. (Se si vuole veramente la soluzione)
+0

Puoi commentare l'aggiornamento2? – aks