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

mjs*_*mjs 20 php mmap fastcgi apc

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

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

Dom*_*nck 20

APC目前没有在fastcgi或fcgid下运行的多个php-cgi worker之间共享缓存.有关详细信息,请参阅此功能请求:"此行为是截至目前的预期行为".

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

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

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

  • 根据另一条评论,将mod_fastcgi配置为仅启动一个php-cgi实例(以便php-cgi本身处理worker,从而共享缓存),httpd.conf中的"FastCgiConfig -maxClassProcesses 1".另见http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html. (4认同)
  • FPM支持它,并且已弃用大多数基于fcgid/fastcgi的解决方案.当你在大型池中的工作者之间共享锁时,APC仍会偶尔出现锁(争用,死锁)问题,但它运行良好(并且*非常好用于文件/操作码缓存),并且FPM具有内置安全性(segfault)当APC确实填充时.(虽然它对死锁没有帮助.) (4认同)

blt*_*t04 10

虽然它并不完美,但Domster建议的方法是最好的.我已经在一些低容量网站上做了很短的时间没有错误.我昨晚写了一个关于如何使用共享操作码缓存设置mod_fastcgi的详细说明.

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