如何在FastCGI下运行时在多个PHP进程之间共享APC缓存?

时间:2009-02-28 18:35:20

标签: php fastcgi apc mmap

我目前正在运行几个PHP / FastCGI副本,启用了APC(如果重要的话,在Apache + mod_fastcgi下)。我可以在进程之间共享缓存吗?我如何检查它是否已经共享? (我认为可能涉及apc.mmap_file_mask ini设置,但我不知道如何使用它。)

(我认为其目前共享的原因之一是,当我重新加载时,apc.php web界面报告的apc.mmap_file_mask翻转了大约3个不同的值。)

3 个答案:

答案 0 :(得分:20)

APC 当前在fastcgi或fcgid下运行的多个php-cgi工作者之间共享其缓存。有关详细信息,请参阅this feature request:“此行为是截至目前的预期行为”。

一种解决方法是允许PHP管理自己的工作者。您可以使用包装器脚本中的PHP_FCGI_CHILDREN环境变量来完成此操作(Web上有大量示例)。如果要使用此方法,还应该阻止fastcgi / fcgid生成多个PHP进程。

PHP_FCGI_CHILDREN的缺点是它对worker的管理不如fcgid / fastcgi提供的那么好。

所以,我们有。在fcgid / fastcgi环境中的APC意味着为每个PHP工作者提供他们自己的缓存,或者禁用fcgid / fastcgi的进程生成以支持PHP的内置管理。让我们希望将来有所改变。

答案 1 :(得分:10)

虽然它并不完美,但Domster建议的方法是最好的。我已经在一些低容量网站上做了很短的时间没有错误。我昨晚在how to set up mod_fastcgi with a shared opcode cache写了详细的解释。

我发现使用mod_fastcgi而不是更新的mod_fcgid非常重要,因为mod_fcgid一次只会向PHP进程发送一个请求,无论PHP通过PHP_FCGI_CHILDREN生成了多少子项。

答案 2 :(得分:0)

缓存应该在进程之间共享。您应该在phpinfo()和apc.php调用之间看到mmap文件的相同值。它适用于我使用建议的默认APC配置设置:

extension="apc.so"
apc.enabled=1
apc.shm_segments=1
apc.shm_size=128
apc.ttl=7200
apc.user_ttl=7200
apc.num_files_hint=1024
apc.mmap_file_mask="/tmp/apc.XXXXXX"
apc.enable_cli=1

您可能想要发布您的设置。我已经看到警告mmap_file_mask必须是它们允许的值之一。因此,如果你错过了其中一个X,那就不知道你会得到什么。

可能涉及到你的fastcgi + apache配置。