OPcache max_accelerated_files 是如何工作的?

How does OPcache max_accelerated_files actually work?

也许这是个愚蠢的问题,但我正在尝试弄清楚 max_accelerated_files 是如何工作的...

我从 PHP 网络

了解 "description/instructions"

opcache.max_accelerated_files integer The maximum number of keys (and therefore scripts) in the OPcache hash table. The actual value used will be the first number in the set of prime numbers { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } that is greater than or equal to the configured value. The minimum value is 200. The maximum value is 100000 in PHP < 5.5.6, and 1000000 in later versions.

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

感谢您的回答

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

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

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