我们正在研究如何让APC只为每个帐户/站点创build一个caching。 这可以通过Fastcgi完成(最新更新为2006年…),但Fastcgid APC将不得不为同一个帐户运行的多个进程创build多个caching。
为了解决这个问题,我们一直在研究PHP-FPM
PHP进程pipe理器允许多个PHP进程共享一个APCcaching。
但是从我读过的东西(我希望我错了),即使您为每个进程创build一个池,跨所有池的所有站点将共享相同的APCcaching。 这使我们回到与共享Memcached相同的问题:这是不安全的!
在php-fpm的网站上,我读到,你可以chroot php-fpm池,并定义一个特定的UID和每个池的GID …如果是这样的话,APC不得不使用这个用户,并没有访问其他池caching?
这里的一篇文章(在2011年)提出,你需要在每个池上运行一个进程,在不同的端口上创build多个启动器,并且每个configuration文件为一个池创build不同的configuration文件:
http://groups.drupal.org/node/198168
这是否仍然是必需的?
如果是这样的话,那么运行php-fpm的800个进程会有什么影响呢? 会主要是记忆吗? 如果是的话,我怎样才能算出记忆的影响呢?
我想,运行800次php-fpm会更好,然后让帐户为单个站点创build多个APCcaching?
如果平均一个帐户创build一个50MBcaching,并创build3个caching每个帐户,使150Mb每个帐户,使120GB …
但是,如果每个帐户使用平均只有50Mb,将使40GB
我们的下一台服务器至less有128GB内存,如果运行800x PHP-FPM不会产生20GB以上的开销,那么40GB是可以接受的!
你认为什么是PHP-FPM最好的方式去提供安全的APCcaching共享主机与具有相当数量的内存的服务器?
或者我应该看看另一个系统?
谢谢 !
我知道你在做什么,因为它是我领导的项目的一部分。 我已经调查过它,似乎解决问题的唯一方法是使用memcached和apc的修改版本。
我认为目前APC允许将数据保存到memcached中,但是我发现它并不是这样,所以解决这个问题最简单的方法是对memcached进行黑客攻击,使其拥有不同的caching帐户,并且可能具有不同的caching大小,然后攻击APC,允许查询memcached从中获取操作码。
Memcached破解也将是有用的,因为你可以设置一个到期的caching时间,并评估什么应该被caching,什么不应该:这样你就可以节省更多的内存,并只在需求使用它。 要select想要使用的帐户,可以使用针对memcached服务器的SASLauthentication(已经开发用于memcached),从而为此configuration提供更高的安全性。
Memcached部署对于caching等其他内容也是有用的,所以我将遵循这个path。
在这里我真的没有看到使用FastCGI的问题。 我会解释:APC是需要频繁点击的网站,而不需要偶尔获得点击的网站。
所以,关于内存效率:你的服务器上有几个站点,其中一些很受欢迎,有些则不是。 每个站点都有FastCGI处理池,PHPpipe理其工作人员(使用带有PHP_FCGI_CHILDRENvariables的FastCGI shell包装器),每个FastCGI池都有生命周期,APCcaching在池的所有PHP进程中共享。
受欢迎的站点会经常点击,FastCGI池不会死亡,APC将保留在内存中,对于所有PHP工作人员来说,其中有50MBcaching。
不那么stream行的网站将触发FastCGI杀死政策和工人将完全closures与APCcaching释放内存。 当这个网站将被击中时,游戏池将会重新启动,首先击中将会变慢。 该模型将低内存消耗和高资源使用情况下的PHP-CGI模式与热备caching的PHP-FPM进程池相结合。
使用PHP-FPM模型,您必须为每个站点保留至less一名工作人员,从而消耗大量内存。
PS。 php-fpm有ondemand补丁,但尚未在生产环境中testing。
我将补充一点,你的文章帮助我find了一个错误,那就是APC操作码caching在几个chroot实例之间混合了几个configuration文件。 所以当使用具有单独的php-fpm守护进程的chrooted池时,仍然是需要的,你不应该使用chrootpath可能在池之间崩溃的几个池。