多租户设置中的APC缓存隔离(cakephp)

时间:2011-11-15 19:54:10

标签: php cakephp apc

我正在使用cakephp来运行多租户应用程序。应用程序只有一个实例,唯一的区别是每个应用程序连接到的数据库。除此之外,该应用程序是相同的。

我的设置:

  1. Apache 2.2
  2. Php 5.3
  3. cake 1.3.10
  4. 赢取2k3服务器

    我在apache的docroot下部署了应用程序(只有1个实例) 该应用正在运行)。我最近从File切换到了APC缓存。该 两个应用程序的缓存文件前缀相同。使用Apache 虚拟主机决定要转到哪个应用。我正在缓存静态 html / js / css / gif但不是php(通过apache的mod_expires)

  5. 问题:

    我注意到APP 1可用的一些缓存值显示在App 2的下拉列表中。我很震惊地看到这种情况发生。

      

    如何在应用之间的APC缓存层中添加隔离?

    更新: 即使我制作应用程序的新副本并将其放入自己的docroot中,也会出现问题!

    UPDATE2

    场景1)1个拥有所有perm / comb的实例

    如果我有像

    这样的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 个答案:

答案 0 :(得分:2)

原因:

  1. APC对vhosts,app或其他“apache”事物一无所知。
  2. 这意味着如果共享apc,则所有vhost之间共享任何缓存键。 (你通常想要的)。
  3. APC没有自己的隔离层。
  4. 解决方法:

    1. 为每个应用程序提供缓存键的前缀。这允许他们访问各个用户缓存密钥的密钥。 (最简单的)
    2. 如果您需要真正的隔离,请使用memcached跟踪breiti的工作流程。 (可能是最好的解决方案)
    3. 您可以考虑为每个虚拟主机运行唯一的PHP.ini和唯一的fcgiwrapper(请参阅:http://chrisgilligan.com/wordpress/apc-cache-considerations-for-virtual-hosting-environments/)。然而,这意味着内存使用量的大幅增加。 (如果你真的想要解决方案)

答案 1 :(得分:1)

一种方法可能是:

  • 为您的用户使用memcached而不是APC
  • 将您的虚拟主机/域绑定到自己的IP
  • 启动vhost的memcache实例(即vhost1 =端口12345,vhost2 =端口12346,...)
  • 添加iptable规则,删除特定内存缓存端口上与该端口的vhost ip不匹配的每个数据包)

你的问题似乎是,php运行为fastcgi,因此每个vhost将获得相同的php进程来共享其缓存。你需要设置php才能为每个vhost运行(不知道你需要查找的内容)。

我更喜欢memcache方法,因为:

  • memcache允许您创建内存缓存集群
  • 它很容易将您的应用程序服务器从缓存服务器中分离出来(用于扩展这是一个巨大的优势)
  • 您从用户缓存中分离字节缓存
  • 正确配置非常安全(因为它的iptables非常可靠)