0

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

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

我将 APC 与 PHP-FPM 一起使用。

4

1 回答 1

2

容易解释的部分是“带 M/G 后缀”,这意味着如果将其设置为 8M,则将分配 8 MB,或者 1G 将分配 1 GB 内存。

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

在此更改中引入了配置值,大部分更改是将apc_string.c添加到 APC 项目中。该 C 文件中定义的主要函数apc_new_interned_string是随后apc_string_pmemcpy在 apc_compile.c 中使用的。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,即使实际上几乎没有任何字符串被缓存。

编辑

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

于 2013-06-14T14:25:57.147 回答