我目前正在运行多个 PHP/FastCGI 副本,并启用了 APC(在 Apache+mod_fastcgi 下,如果重要的话)。我可以在进程之间共享缓存吗?如何检查它是否已经共享?(我认为apc.mmap_file_mask
可能涉及ini设置,但我不知道如何使用它。)
(我认为它目前不共享的原因之一是apc.mmap_file_mask
,正如 apc.php Web 界面所报告的那样,当我重新加载时,它会在大约 3 个不同的值之间翻转。)
APC当前不在fastcgi 或 fcgid 下运行的多个 php-cgi 工作人员之间共享其缓存。有关详细信息,请参阅此功能请求:“此行为是目前的预期行为”。
一种解决方法是允许 PHP 管理自己的工作人员。您可以使用包装脚本中的 PHP_FCGI_CHILDREN 环境变量来执行此操作(网络上为此提供了大量示例)。如果您想使用此方法,您还应该阻止 fastcgi/fcgid 生成多个 PHP 进程。
PHP_FCGI_CHILDREN 的缺点是它对worker 的管理不如fcgid/fastcgi 提供的那样好。
所以,我们到了。fcgid/fastcgi 环境中的 APC 意味着给每个 PHP 工作者自己的缓存,或者禁用 fcgid/fastcgi 的进程生成以支持 PHP 的内置管理。让我们希望这种情况在未来有所改变。
虽然它并不完美,但 Domster 建议的方法是最好的。我在一些低容量站点上做了很短的时间,没有错误。昨晚我写了一篇关于如何使用共享操作码缓存设置 mod_fastcgi的详细说明。
我发现使用 mod_fastcgi 而不是较新的 mod_fcgid 非常重要,因为 mod_fcgid 一次只会向 PHP 进程发送一个请求,而不管 PHP 通过 PHP_FCGI_CHILDREN 产生了多少子进程。
缓存应该在进程之间共享。您应该看到 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 配置。