OPcache max_accelerated_files 是如何工作的?

Posted

技术标签:

【中文标题】OPcache max_accelerated_files 是如何工作的?【英文标题】:How does OPcache max_accelerated_files actually work? 【发布时间】:2018-04-30 01:15:27 【问题描述】:

也许这是个愚蠢的问题,但我想弄清楚 max_accelerated_files 是如何工作的……

我了解 php 网的“描述/说明”

opcache.max_accelerated_files integer 最大键数(和 因此脚本)在 OPcache 哈希表中。使用的实际值 将是素数集合中的第一个数字 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 大于 或等于配置的值。最小值为 200。 PHP

但我的问题是,一旦配置了这个号码,它会做什么。它是否为此设置分配内存?如果我们有足够的内存,我们为什么不直接设置数字 1000000 就可以了?如果我们假设将此数字配置为 2000 并且我们有 2010 个文件,会发生什么?他们是否有某种堆栈,并且一旦该文件轮到它就会被缓存?未缓存的文件会怎样?

感谢您的回答

【问题讨论】:

【参考方案1】:

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.phprequire ../../include.php 之类的相对路径,可以使用不同的键多次缓存一个文件。避免这种情况的最干净的解决方案是使用适当的自动加载。

【讨论】:

以上是关于OPcache max_accelerated_files 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

php配置opcache

php_opcache怎么开启不了

细说opcache

php 开启opcache

php开启opcache

求救,为啥PHP 开启opcache后,访问502 Bad Gateway错误