什么';s PHP APC缓存';s apc.shm\u字符串\u缓冲区设置?

什么';s PHP APC缓存';s apc.shm\u字符串\u缓冲区设置?,apc,php,php-internals,Apc,Php,Php Internals,我试图理解apc.ini中的apc.shm_strings_缓冲区设置。重新启动PHP后,APC admin中的饼图显示已经使用了8MB的缓存,即使没有缓存项(当然,除了APC.PHP)。我发现这与apc.shm_strings_缓冲区设置有关 有人能帮我理解设置的含义吗?配置文件指出,这是“为字符串保留的共享内存大小,带有M/G后缀”,但我无法理解 我将APC与PHP-FPM结合使用。简单的解释是“使用m/G后缀”,这意味着如果将其设置为8M,则将分配8MB的内存,或者1G将分配1GB的内存

我试图理解apc.ini中的apc.shm_strings_缓冲区设置。重新启动PHP后,APC admin中的饼图显示已经使用了8MB的缓存,即使没有缓存项(当然,除了APC.PHP)。我发现这与apc.shm_strings_缓冲区设置有关

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


我将APC与PHP-FPM结合使用。

简单的解释是“使用m/G后缀”,这意味着如果将其设置为8M,则将分配8MB的内存,或者1G将分配1GB的内存

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

引入了config值,大部分更改将添加到APC项目中。该C文件中定义的主要函数是
apc\u new\u interned\u string
,然后在apc\u compile.C中的
apc\u string\u 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)));
/*私有成员以损坏的形式存储在属性信息中
*表单的字符串:
*      \0\0\0
*/
检查((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,尽管实际上几乎没有任何字符串被缓存

编辑


虽然这回答了它的作用,但我不知道如何查看共享字符串缓冲区的使用量,因此无法知道它应该设置为什么。

您的回答肯定会澄清一些问题,尽管内部使用的字符串缓存的概念仍然让我感到困惑(这就是为什么我花了一些时间来评论)。对于三年前引入的一个更改,关于它的可用信息非常少,因此,正如您所说,我真的不知道该将其设置为什么(我想我只会坚持8M默认值?)。当然,为什么不:)顺便说一句,我刚刚发现apc缓存已被弃用,因为它不在积极开发中,并且被ZendOptimizer所取代,ZendOptimizer被重命名为OPCache,所以只要现在一切正常,我就离开它。顺便说一句,OPCache确实有不错的文档,很高兴知道,谢谢。我不知道我对它的感觉如何,因为APC工作得相当好,而且OPCache显然没有用户缓存。无论如何,感谢你的帮助,我认为你的答案尽可能地澄清了问题,所以我现在将其标记为这样。我处于相同的位置-我使用APC,它可以工作,我还使用它在本地缓存用户数据。继续使用APC处理用户数据的项目在黄金时间似乎还没有完全准备好——所以我将坚持使用APC至少6个月。