我正在尝试了解apc.ini中的apc.shm_strings_buffer设置。重新启动PHP后,APC管理员中的饼图显示已经使用了8MB的缓存,即使没有缓存的条目(当然除了apc.php)。我发现这与apc.shm_strings_buffer设置有关。
有人可以帮我理解设置的含义吗?配置文件指出这是“为字符串保留的共享内存大小,带有M / G后缀”,但我无法理解。
我正在使用APC和PHP-FPM。
答案 0 :(得分: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,即使实际上几乎没有任何字符串被缓存。
修改的
虽然这回答了它的作用,但我不知道如何查看共享字符串缓冲区的使用量,因此无法知道应该设置的内容。