OPcache max_accelerated_files 实际上是如何工作的?

Val*_*or_ 7 php opcache

也许这是一个愚蠢的问题,但我试图弄清楚 max_accelerated_files 实际是如何工作的......

我理解 PHP net 的“描述/说明”

opcache.max_accelerated_files 整数 OPcache 哈希表中键(以及脚本)的最大数量。使用的实际值将是素数集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中大于或等于配置值的第一个数字。最小值为 200。 PHP < 5.5.6 中最大值为 100000,更高版本中为 1000000。

但我的问题是配置后它会如何处理这个数字。它是否为此设置分配内存?如果我们有足够的内存,为什么我们不直接设置数字 1000000 就这样呢?如果我们将此数字配置为 2000 并且我们有 2010 个文件,会发生什么情况?它们是否对堆栈进行某种排序,一旦该文件发生变化,它就会被缓存?未缓存的文件会发生什么情况?

谢谢您的回答

ger*_*ere 4

OPCache 将缓存的脚本存储在 HashTable 中,这是一种具有非常快的查找时间(平均)的数据结构,因此可以快速检索缓存的脚本。max_accelerated_files表示此 HashTable 中可以存储的最大键数。您可以将其视为关联数组中键的最大数量。为此分配的内存是 OPCache 可以使用的共享内存的一部分,您可以使用选项对其进行配置opcache.memory_consumption。当 OPCache 尝试缓存的脚本多于可用键数时,它会触发重新启动并清理当前缓存。

因此,假设您配置opcache.max_accelerated_files为 223,并且将请求/home路由解析并缓存到 OPCache 200 脚本中。只要您的下一个请求只需要这 200 个脚本,OPCache 就可以了。但是,如果以下请求之一解析 24 个新脚本,OPCache 将触发重新启动以腾出空间来缓存这些脚本。由于您不希望发生这种情况,因此您应该监视 OPCache 并选择适当的数字。

require include.php请记住,如果需要使用或等相对路径,可以使用不同的键多次缓存一个文件require ../../include.php。避免这种情况的最干净的解决方案是使用适当的自动加载。