2013-06-13 86 views
0

我想了解apc.ini中的apc.shm_strings_buffer设置。重新启动PHP后,APC管理中的饼图显示已经使用了8MB的缓存,尽管没有缓存条目(当然除了apc.php)。我发现这与apc.shm_strings_buffer设置有关。什么是PHP APC缓存的apc.shm_strings_buffer设置?

有人能帮我理解设置的含义吗?配置文件指出这是“为字符串保留的共享内存大小,带有M/G后缀”,但我无法理解。

我正在使用PHP-FPM的APC。

回答

2

容易解释的部分是“带M/G后缀”,这意味着如果将其设置为8M,那么将分配8兆字节,否则1G将分配1千兆字节的内存。

更难解释的一点是,它是一个缓存,用于存储由编译和缓存操作码时APC内部使用的字符串。

配置值被引入in this change,大部分更改是将apc_string.c添加到APC项目。在C文件中定义的主要功能是apc_new_interned_string,然后在apc_compile.c的apc_string_pmemcpy中使用。 APC模块的其余部分存储字符串。

例如在apc_compile.c

/* private members are stored inside property_info as a mangled 
* string of the form: 
*  \0<classname>\0<membername>\0 
*/ 
CHECK((dst->name = apc_string_pmemcpy((char *)src->name, src->name_length+1, pool TSRMLS_CC))); 

当APC去存储字符串,函数apc_new_interned_string看起来,看它是否该字符串已经在弦上做一个哈希保存在内存中,如果它已经存储在内存中,它返回存储的字符串的前一个实例。

只有当该字符串尚未存储在缓存中时,才会分配新的内存来存储该字符串。

如果您使用PHP-FPM运行PHP,我90%确信存储字符串的缓存是在单个池中的所有工作人员之间共享的,但我仍然仔细检查了这一点。

分配给存储共享字符串的整个大小在PHP启动时分配 - 它不是动态分配的。所以可以预料,APC显示了用于字符串缓存的8MB,即使几乎没有任何字符串实际上已被缓存。

编辑

虽然这个回答它做什么,我不知道如何,看看有多少的共享字符串缓冲区正在被使用,所以没有知道什么应该设为方式。

+0

虽然内部使用的字符串缓存的概念仍然让我大跌眼镜(这就是为什么我花了一段时间评论),您的答案肯定会清除一些东西。对于三年前推出的改变,关于它的信息非常少,所以,就像你说的,我真的不知道该怎么设置(我想我会坚持8M的默认值)? 。 – redburn

+0

当然,为什么不:)顺便说一句,我刚刚发现,APC缓存是边缘弃用,因为它不在积极的发展,并正在被更名为OPCache的ZendOptimizer取代,所以只要现在工作的东西我只是离开它。顺便说一句OPCache确实有体面的文档https://github.com/zendtech/ZendOptimizerPlus/blob/master/README – Danack

+0

这很好,知道,谢谢。不知道我对此感觉如何,因为APC工作得很好,OPCache显然没有用户缓存。无论如何,感谢您的帮助,我认为您的答案尽可能清除了所有问题,所以我现在将它标记为这样。 – redburn