2011-11-15 14 views
5

Estoy usando cakephp para ejecutar una aplicación multi-tenant. Solo hay 1 instancia de la aplicación, la única diferencia es la base de datos a la que se conecta cada aplicación. Aparte de eso, la aplicación es idéntica.Aislamiento de caché APC en una configuración tentant múltiple (cakephp)

Mi configuración:

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

    tengo la aplicación desplegada bajo docroot de Apache (justo 1 instancia de la aplicación se está ejecutando). Recientemente cambié de File a caché de APC. Los prefijos de archivo para el almacenamiento en caché son los mismos para ambas aplicaciones. Usando Apache Hosts Virtuales para decidir a qué aplicación ir. Estoy almacenamiento en caché estática html/js/css/gif, pero no php (a través de mod_expires de Apache)

Problema:

me di cuenta de que algunos de los valores almacenados en caché que se suponía iban a estar a disposición de La APLICACIÓN 1 se mostraba en el menú desplegable de la Aplicación 2. Me sorprendió ver que esto sucediera.

¿Cómo puedo agregar aislamiento en la capa de caché de APC entre las aplicaciones?

ACTUALIZACIÓN: problema ocurre incluso si hago una nueva copia de la aplicación y la puse en su propia docroot !!!

Update2

Escenario 1) 1 instancia que tiene toda la ondulación permanente/peine

Si tengo código php como

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

y este código es compartido tanto por el cliente 1 y cliente 2, ¿cómo afectará esto el almacenamiento en caché de APC?

Escenario 2) 2 cada instancia personalizarse por cliente

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

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

Cómo afecta esto a la memoria caché de APC? Si entiendo bien, para el Escenario 1, es posible tener una mezcla de datos cliente1 con el cliente 2 (muy malo) Para el Escenario 2, siempre que use diferentes claves de caché, ¿estoy seguro de que nunca tendré una confusión?

Respuesta

1

Una forma podría ser:

  • uso memcached en lugar de APC para sus usuarios
  • unen sus VHosts/dominios de poseer IPs
  • iniciar instancias memcache para su host virtual (es decir,vhost1 = el puerto 12345, vhost2 = puerto 12346, ...)
  • añadir filetes iptable que caen cada paquete en el puerto Memcache específica que no coincide con su IP host virtual para ese puerto)

Su problema parece ser, ese php se ejecuta como fastcgi, por lo que cada vhost obtendrá el mismo proceso de php para compartir su caché. Necesitas configurar php para que se ejecute solo para cada vhost (no sabes por lo que tienes que buscar).

yo preferiría el método Memcache porque:

  • Memcache permite crear un cluster Memcache
  • es fácil de separar el servidor de aplicaciones desde los servidores de almacenamiento en caché (por escalamiento eso es una gran ventaja)
  • que bytecache separada de caché de usuario
  • correcto configurada muy seguro (como sus iptables es muy fiable
+0

Gracias por la Memcache por IP: idea de puerto, pero ¿qué pasa con el caché de código de operación? – aks

2

El por qué:

  1. APC no sabe nada acerca de vhosts, aplicaciones u otras cosas "Apache".
  2. Esto significa que cualquier clave de caché se comparte entre todos los hosts si se comparte la aplicación. (Que generalmente quiere).
  3. APC no tiene su propia capa de aislamiento.

Solución:

  1. Dé a cada aplicación que poseen prefijo de claves de caché. Esto les permite acceder a las teclas claves de caché de usuario individuales. (Más fácil)
  2. Siga el flujo de trabajo de breiti con memcached si necesita aislamiento verdadero. (Probablemente la mejor solución)
  3. Puede considerar ejecutar para cada host virtual un PHP.ini único y un fcgiwrapper único (vea: http://chrisgilligan.com/wordpress/apc-cache-considerations-for-virtual-hosting-environments/). Sin embargo, esto significa un gran aumento en el uso de la memoria. (La solución si realmente lo quiere)
+0

¿Puedes comentar en update2? – aks

Cuestiones relacionadas