运行时配置

这些函数的行为受 php.ini 中设置的影响。

OPcache 配置选项
名称 默认值 可更改 变更日志
opcache.enable 1 INI_ALL  
opcache.enable_cli 0 INI_SYSTEM 从 PHP 7.1.2 到 7.1.6(包括)之间,默认值为 1
opcache.memory_consumption 128 INI_SYSTEM  
opcache.interned_strings_buffer 8 INI_SYSTEM  
opcache.max_accelerated_files 10000 INI_SYSTEM  
opcache.max_wasted_percentage 5 INI_SYSTEM  
opcache.use_cwd 1 INI_SYSTEM  
opcache.validate_timestamps 1 INI_ALL  
opcache.revalidate_freq 2 INI_ALL  
opcache.revalidate_path 0 INI_ALL  
opcache.save_comments 1 INI_SYSTEM  
opcache.fast_shutdown 0 INI_SYSTEM 在 PHP 7.2.0 中移除
opcache.enable_file_override 0 INI_SYSTEM  
opcache.optimization_level 0x7FFEBFFF INI_SYSTEM 在 PHP 7.3.0 中从 0x7FFFBFFF 更改
opcache.inherited_hack 1 INI_SYSTEM 在 PHP 7.3.0 中移除
opcache.dups_fix 0 INI_ALL  
opcache.blacklist_filename "" INI_SYSTEM  
opcache.max_file_size 0 INI_SYSTEM  
opcache.consistency_checks 0 INI_ALL 从 8.1.18 和 8.2.5 开始禁用。从 PHP 8.3.0 开始移除。
opcache.force_restart_timeout 180 INI_SYSTEM  
opcache.error_log "" INI_SYSTEM  
opcache.log_verbosity_level 1 INI_SYSTEM  
opcache.record_warnings 0 INI_SYSTEM 从 PHP 8.0.0 开始可用
opcache.preferred_memory_model "" INI_SYSTEM  
opcache.protect_memory 0 INI_SYSTEM  
opcache.mmap_base null INI_SYSTEM 仅 Windows。
opcache.restrict_api "" INI_SYSTEM  
opcache.file_update_protection 2 INI_ALL  
opcache.huge_code_pages 0 INI_SYSTEM  
opcache.lockfile_path "/tmp" INI_SYSTEM  
opcache.opt_debug_level 0 INI_SYSTEM 从 PHP 7.1.0 开始可用
opcache.file_cache null INI_SYSTEM  
opcache.file_cache_only 0 INI_SYSTEM  
opcache.file_cache_consistency_checks 1 INI_SYSTEM  
opcache.file_cache_fallback 1 INI_SYSTEM 仅 Windows。
opcache.validate_permission 0 INI_SYSTEM 从 PHP 7.0.14 开始可用
opcache.validate_root 0 INI_SYSTEM 从 PHP 7.0.14 开始可用
opcache.preload "" INI_SYSTEM 从 PHP 7.4.0 开始可用
opcache.preload_user "" INI_SYSTEM 从 PHP 7.4.0 开始可用
opcache.cache_id "" INI_SYSTEM 仅 Windows。从 PHP 7.4.0 开始可用
opcache.jit "tracing" INI_ALL 从 PHP 8.0.0 开始可用
opcache.jit_buffer_size 0 INI_SYSTEM 从 PHP 8.0.0 开始可用
opcache.jit_debug 0 INI_ALL 从 PHP 8.0.0 开始可用
opcache.jit_bisect_limit 0 INI_ALL 从 PHP 8.0.0 开始可用
opcache.jit_prof_threshold 0.005 INI_ALL 从 PHP 8.0.0 开始可用
opcache.jit_max_root_traces 1024 INI_SYSTEM 从 PHP 8.0.0 开始可用
opcache.jit_max_side_traces 128 INI_SYSTEM 从 PHP 8.0.0 开始可用
opcache.jit_max_exit_counters 8192 INI_SYSTEM 从 PHP 8.0.0 开始可用
opcache.jit_hot_loop 64 INI_SYSTEM 从 PHP 8.0.0 开始可用
opcache.jit_hot_func 127 INI_SYSTEM 从 PHP 8.0.0 开始可用
opcache.jit_hot_return 8 INI_SYSTEM 从 PHP 8.0.0 开始可用
opcache.jit_hot_side_exit 8 INI_SYSTEM 从 PHP 8.0.0 开始可用
opcache.jit_blacklist_root_trace 16 INI_ALL 从 PHP 8.0.0 开始可用
opcache.jit_blacklist_side_trace 8 INI_ALL 从 PHP 8.0.0 开始可用
opcache.jit_max_loop_unrolls 8 INI_ALL 从 PHP 8.0.0 开始可用
opcache.jit_max_recursive_calls 2 INI_ALL 从 PHP 8.0.0 开始可用
opcache.jit_max_recursive_returns 2 INI_ALL 从 PHP 8.0.0 开始可用
opcache.jit_max_polymorphic_calls 2 INI_ALL 从 PHP 8.0.0 开始可用
有关 INI_* 模式 的更多详细信息和定义,请参阅 配置设置的位置

以下是对配置指令的简要解释。

opcache.enable bool

启用操作码缓存。禁用后,代码不会被优化或缓存。设置 opcache.enable 无法通过 ini_set() 在运行时启用,只能禁用。尝试在脚本中启用它将生成警告。

opcache.enable_cli bool

启用 CLI 版本的 PHP 的操作码缓存。

opcache.memory_consumption int

OPcache 使用的共享内存存储的大小,以兆字节为单位。最小允许值为 "8",如果设置了更小的值,则会强制执行此值。

opcache.interned_strings_buffer int

用于存储内部字符串的内存量,以兆字节为单位。

opcache.max_accelerated_files int

OPcache 哈希表中的键(因此是脚本)的最大数量。实际使用 的值为大于或等于配置值的素数集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987, 262237, 524521, 1048793 } 中的第一个数字。最小值为 200。最大值为 1000000。超出此范围的值将被限制在允许的范围内。

opcache.max_wasted_percentage int

在调度重启之前允许的浪费内存的最大百分比,如果可用内存不足。最大允许值为 "50",如果设置了更大的值,则会强制执行此值。

opcache.use_cwd bool

如果启用,OPcache 会将当前工作目录附加到脚本键,从而消除具有相同基本名称的文件之间可能发生的冲突。禁用此指令可以提高性能,但可能会破坏现有的应用程序。

opcache.validate_timestamps bool

如果启用,OPcache 将每 opcache.revalidate_freq 秒检查一次更新后的脚本。当此指令被禁用时,你必须通过 opcache_reset()opcache_invalidate() 或重新启动 Web 服务器来手动重置 OPcache,以便文件系统更改生效。

注意: 如果 opcache.file_update_protectionopcache.max_file_size 选项设置为非零值,OPcache 仍可能在编译时验证文件的 时间戳。

opcache.revalidate_freq int

检查脚本时间戳以获取更新的频率,以秒为单位。 0 将导致 OPcache 在每个请求上检查更新。

如果 opcache.validate_timestamps 被禁用,则忽略此配置指令。

opcache.revalidate_path bool

如果禁用,将重新使用使用相同 include_path 的现有缓存文件。因此,如果包含路径中其他位置存在同名文件,则不会找到它。

opcache.save_comments bool

如果禁用,所有文档注释将从操作码缓存中丢弃,以减小优化代码的大小。禁用此配置指令可能会破坏依赖于注释解析来进行注释的应用程序和框架,包括 Doctrine、Zend Framework 2 和 PHPUnit。

opcache.fast_shutdown bool

如果启用,将使用快速关闭序列,该序列不会释放每个已分配的块,而是依赖于 Zend 引擎内存管理器来批量释放整个请求变量集。

此指令已在 PHP 7.2.0 中移除。快速关闭序列的变体已集成到 PHP 中,如果可能,将自动使用。

opcache.enable_file_override bool

启用后,在调用 file_exists()is_file()is_readable() 时,操作码缓存将检查文件是否已被缓存。这可能会提高检查 PHP 脚本是否存在和可读性的应用程序的性能,但如果 opcache.validate_timestamps 被禁用,则可能会返回陈旧的数据。

opcache.optimization_level int

一个位掩码,用于控制执行哪些优化过程。默认情况下,将应用所有安全优化。更改默认值主要用于调试/开发优化器(另请参见 opcache.opt_debug_level)。

opcache.inherited_hack bool

此配置指令将被忽略。

opcache.dups_fix bool

此技巧只应在解决 "无法重新声明类" 错误时启用。

opcache.blacklist_filename string

OPcache 黑名单文件的路径。黑名单文件是一个文本文件,其中包含不应加速的文件的名称,每行一个。允许使用通配符,也可以提供前缀。以分号开头的行将被忽略,作为注释。

一个简单的黑名单文件可能如下所示

; Matches a specific file.
/var/www/broken.php
; A prefix that matches all files starting with x.
/var/www/x
; A wildcard match.
/var/www/*-broken.php
opcache.max_file_size int

将被缓存的最大文件大小,以字节为单位。如果为 0,则所有文件都将被缓存。

opcache.consistency_checks int

如果非零,OPcache 将每 N 个请求验证一次缓存校验和,其中 N 是此配置指令的值。这应该仅在调试时启用,因为它会影响性能。

注意:

从 8.1.18 和 8.2.5 开始禁用。从 PHP 8.3.0 开始移除。

opcache.force_restart_timeout int

如果缓存未处于活动状态,则等待计划重启开始的时间长度(以秒为单位)。如果超时,则 OPcache 假设出现问题,并将杀死持有缓存锁的进程以允许重启。

如果 opcache.log_verbosity_level 设置为 2 或更高,则在发生这种情况时,错误日志中将记录警告。

此指令在 Windows 上不受支持。

opcache.error_log string

OPcache 错误的错误日志。空字符串与 stderr 相同,并将导致日志发送到标准错误(在大多数情况下将是 Web 服务器错误日志)。

opcache.log_verbosity_level int

日志详细程度级别。默认情况下,仅记录致命错误(级别 0)和错误(级别 1)。其他可用级别包括警告(级别 2)、信息消息(级别 3)和调试消息(级别 4)。

opcache.record_warnings bool

如果启用,OPcache 将记录编译时警告,并在下次包含时重放它们,即使它从缓存中提供服务也是如此。

opcache.preferred_memory_model string

OPcache 要使用的首选内存模型。如果留空,OPcache 将选择最合适的模型,这在几乎所有情况下都是正确的行为。

可能的值包括 mmapshmposixwin32

opcache.protect_memory bool

在执行脚本时保护共享内存免受意外写入。这仅对内部调试有用。

opcache.mmap_base string

Windows 上用于共享内存段的基地址。所有 PHP 进程都必须将共享内存映射到同一个地址空间。使用此指令可以解决“无法重新附加到基地址”错误。

opcache.restrict_api string

仅允许从路径以指定字符串开头的 PHP 脚本调用 OPcache API 函数。默认的 "" 表示没有限制。

opcache.file_update_protection string

防止缓存年龄小于此秒数的文件。它可以防止缓存未完全更新的文件。如果所有文件更新都是原子的,则可以通过将其设置为 0 来提高性能。这将允许立即缓存文件。

opcache.huge_code_pages bool

启用或禁用将 PHP 代码(文本段)复制到 HUGE PAGES。这应该提高性能,但需要适当的操作系统配置。在 PHP 7.0.0 的 Linux 上可用,在 PHP 7.4.0 的 FreeBSD 上可用。

opcache.lockfile_path string

用于存储共享锁文件的绝对路径(仅限 *nix)。

opcache.opt_debug_level string

生成用于调试不同优化阶段的 opcode 转储。0x10000 将输出编译器在任何优化发生之前生成的 opcode,而 0x20000 将输出优化后的代码。

opcache.file_cache string

启用并设置二级缓存目录。当 SHM 内存已满、服务器重启或 SHM 重置时,它应该提高性能。默认的 "" 禁用基于文件的缓存。

opcache.file_cache_only bool

启用或禁用在共享内存中的 opcode 缓存。

注意:

在 PHP 8.1.0 之前,在已经填充的文件缓存的情况下禁用此指令需要手动清除文件缓存。

opcache.file_cache_consistency_checks bool

启用或禁用从文件缓存加载脚本时的校验和验证。

opcache.file_cache_fallback bool

为无法重新附加到共享内存的特定进程隐含 opcache.file_cache_only=1(仅限 Windows)。需要显式启用文件缓存。

警告

禁用此配置选项可能会阻止进程启动,因此不建议这样做。

opcache.validate_permission bool

验证缓存文件的权限与当前用户是否匹配。

opcache.validate_root bool

防止在 chroot 环境中出现名称冲突。这应该在所有 chroot 环境中启用,以防止访问 chroot 之外的文件。

opcache.preload string

指定将在服务器启动时编译和执行的 PHP 脚本,该脚本可以通过 include 它们或使用 opcache_compile_file() 函数来预加载其他文件。这些文件中定义的所有实体(例如函数和类)都将立即可用于请求,直到服务器关闭。

注意:

预加载在 Windows 上不受支持。

opcache.preload_user string

允许以指定的系统用户运行预加载。这对以 root 身份启动并在切换到非特权系统用户之前启动的服务器很有用。出于安全原因,默认情况下不允许以 root 身份进行预加载,除非此指令显式设置为 root

opcache.cache_id string

在 Windows 上,所有在同一个用户帐户下运行相同 PHP SAPI 且具有相同缓存 ID 的进程共享同一个 OPcache 实例。缓存 ID 的值可以自由选择。

提示

对于 IIS,不同的应用程序池可以通过使用环境变量 APP_POOL_ID 作为 opcache.cache_id 来拥有自己的 OPcache 实例。

opcache.jit string|int

对于典型用法,此选项接受四个字符串值之一

  • disable: 完全禁用,无法在运行时启用。
  • off: 禁用,但可以在运行时启用。
  • tracing/on: 使用追踪 JIT。默认情况下启用,推荐大多数用户使用。
  • function: 使用函数 JIT。

对于高级用法,此选项接受一个 4 位整数 CRTO,其中数字表示

C (CPU 特定的优化标志)
  • 0: 禁用 CPU 特定的优化。
  • 1: 启用 AVX 的使用,如果 CPU 支持它。
R (寄存器分配)
  • 0: 不要执行寄存器分配。
  • 1: 执行块局部寄存器分配。
  • 2: 执行全局寄存器分配。
T (触发)
  • 0: 在脚本加载时编译所有函数。
  • 1: 在第一次执行时编译函数。
  • 2: 在第一个请求上分析函数,并在之后编译最热的函数。
  • 3: 随时分析并编译热门函数。
  • 4: 当前未使用。
  • 5: 使用追踪 JIT。随时分析并为热门代码段编译追踪。
O (优化级别)
  • 0: 无 JIT。
  • 1: 最小 JIT(调用标准 VM 处理程序)。
  • 2: 内联 VM 处理程序。
  • 3: 使用类型推断。
  • 4: 使用调用图。
  • 5: 优化整个脚本。
"tracing" 模式对应于 CRTO = 1254"function" 模式对应于 CRTO = 1205

opcache.jit_buffer_size int

为编译的 JIT 代码保留的共享内存量。零值禁用 JIT。

当使用 int 时,该值以字节为单位。还可以使用 此常见问题解答 中描述的简写符号。
opcache.jit_debug int

一个位掩码,指定要启用的 JIT 调试输出。有关可能的值,请咨询 » zend_jit.h(搜索以 ZEND_JIT_DEBUG 开头的宏定义)。

opcache.jit_bisect_limit int

调试选项,在编译一定数量的函数后禁用 JIT 编译。这可能有助于确定 JIT 错误编译的来源。注意:此选项仅在 JIT 触发器设置为 0(在脚本加载时编译)或 1(在第一次执行时编译)时有效,例如 opcache.jit=1215。在 opcache.jit 选项中了解详细信息。

opcache.jit_prof_threshold float

当使用“在第一个请求上分析”触发器模式时,此阈值决定函数是否被认为是热门的。对函数的调用次数除以对所有函数的调用次数必须高于阈值。例如,阈值为 0.005 表示构成所有调用超过 0.5% 的函数将被 JIT 编译。

opcache.jit_max_root_traces int

最大根追踪数量。根追踪是第一次通过代码执行一个路径的执行流,这是 JIT 编译的单位。如果达到此限制,JIT 将不会编译新代码。

opcache.jit_max_side_traces int

根跟踪可能具有的最大侧跟踪数。侧跟踪是另一个不遵循已编译根跟踪路径的执行流。如果达到此限制,属于同一个根跟踪的侧跟踪将不会被编译。

opcache.jit_max_exit_counters int

侧跟踪退出计数器的最大数量。这限制了所有根跟踪中可能存在的侧跟踪的总数。

opcache.jit_hot_loop int

循环被认为是热循环的迭代次数。有效值范围为 [0,255];对于超出此范围的任何设置,例如 -1256,将使用默认值。 0 将禁用 JIT 来跟踪和编译任何循环。

opcache.jit_hot_func int

函数被认为是热函数的调用次数。有效值范围为 [0,255];对于超出此范围的任何设置,例如 -1256,将使用默认值。 0 将禁用 JIT 来跟踪和编译任何函数。

opcache.jit_hot_return int

返回值被认为是热返回值的返回次数。有效值范围为 [0,255];对于超出此范围的任何设置,例如 -1256,将使用默认值。 0 将禁用 JIT 来跟踪和编译任何返回值。

opcache.jit_hot_side_exit int

侧退出被认为是热侧退出的退出次数。有效值范围为 [0,255];对于超出此范围的任何设置,例如 -1256,将使用默认值。 0 将禁用 JIT 来跟踪和编译任何侧退出。

opcache.jit_blacklist_root_trace int

在将根跟踪列入黑名单之前尝试编译根跟踪的最大次数。

opcache.jit_blacklist_side_trace int

在将侧跟踪列入黑名单之前尝试编译侧跟踪的最大次数。

opcache.jit_max_loop_unrolls int

在侧跟踪中尝试展开循环的最大次数,尝试到达根跟踪并关闭外部循环。

opcache.jit_max_recursive_calls int

展开的递归调用循环的最大数量。

opcache.jit_max_recursive_returns int

展开的递归返回循环的最大数量。

opcache.jit_max_polymorphic_calls int

尝试内联多态(动态或方法)调用的最大次数。超过此限制的调用将被视为巨态调用,不会被内联。

添加笔记

用户贡献笔记 8 notes

19
damien at overeem dot org
7 年前
在 Windows 平台上使用 PHP 并启用 opcache 时,您可能会遇到偶尔的 500 错误。这些错误似乎完全随机出现。

发生这种情况时,您的 Windows 事件日志(Windows 日志/应用程序)将显示(可能多个)来自 Zend OPcache 的条目,事件 ID 为 487。更多信息将说明以下错误消息:“基地址标记不可用内存区域”。

可以通过在 php.ini 中添加以下内容来解决此问题

opcache.mmap_base = 0x20000000

不幸的是,我不知道值“0x20000000”的意义。我只能告诉你这个值可以解决问题(经过测试验证)
9
wessos at example dot org
5 年前
截至 PHP 7.3 的优化级别如下

#define ZEND_OPTIMIZER_PASS_1 (1<<0) /* CSE, STRING construction */
#define ZEND_OPTIMIZER_PASS_2 (1<<1) /* Constant conversion and jumps */
#define ZEND_OPTIMIZER_PASS_3 (1<<2) /* ++, +=, series of jumps */
#define ZEND_OPTIMIZER_PASS_4 (1<<3) /* INIT_FCALL_BY_NAME -> DO_FCALL */
#define ZEND_OPTIMIZER_PASS_5 (1<<4) /* CFG based optimization */
#define ZEND_OPTIMIZER_PASS_6 (1<<5) /* DFA based optimization */
#define ZEND_OPTIMIZER_PASS_7 (1<<6) /* CALL GRAPH optimization */
#define ZEND_OPTIMIZER_PASS_8 (1<<7) /* SCCP (constant propagation) */
#define ZEND_OPTIMIZER_PASS_9 (1<<8) /* TMP VAR usage */
#define ZEND_OPTIMIZER_PASS_10 (1<<9) /* NOP removal */
#define ZEND_OPTIMIZER_PASS_11 (1<<10) /* Merge equal constants */
#define ZEND_OPTIMIZER_PASS_12 (1<<11) /* Adjust used stack */
#define ZEND_OPTIMIZER_PASS_13 (1<<12) /* Remove unused variables */
#define ZEND_OPTIMIZER_PASS_14 (1<<13) /* DCE (dead code elimination) */
#define ZEND_OPTIMIZER_PASS_15 (1<<14) /* (unsafe) Collect constants */
#define ZEND_OPTIMIZER_PASS_16 (1<<15) /* Inline functions */

来源:https://lxr.room11.org/xref/php-src%40master/ext/opcache/Optimizer/zend_optimizer.h
6
carneiro at isharelife dot com dot br
4 年前
如果您尝试使用 opcache.memory_consumption 分配超过可用内存的内存,PHP 将停止工作,没有任何日志来帮助调试。在创建具有相同配置和更少可用内存的预发布服务器时,此问题花了我 4 个小时来解决。
5
tizian dot schmidlin at gmail dot com
5 年前
需要注意的是,根据原始 RFC (https://wiki.php.net/rfc/preload),`opcache.preload` 会将预加载文件永久缓存到所有底层 PHP 进程实例中。

这意味着,在同一台服务器上托管多个网站可能会导致一些意想不到的行为。

具体示例
- 您有一个 Symfony 3.2 应用程序(可能是某种类型的端点)和一个 Symfony 3.4 应用程序(可能是您的主要应用程序)
- 两个应用程序都拥有一个名为 App 的主类,该类位于同一个命名空间中(这是常见的,因为类名称对于每个项目都是唯一的)
- 根据哪个应用程序先加载,一个或另一个将起作用,因为 `opcache.preload` 没有针对哪个类在何处使用进行基于文件的区分,只是将它们提供给用户空间

可以通过简单地不预加载用户空间类来避免这种情况,或者,如果您使用的是 FPM,则可以为每个应用程序定义一个池。

为了优化内存消耗,您也可以为所有 Symfony 3.4 应用程序使用一个通用的 FPM 池,并在其中预加载整个框架,只是不预加载用户空间类(这些类可能仍然会被 opcache 缓存,但速度较慢,因为它将在每次请求时检查文件是否已更改)。
4
bdurand at ensemblegroup dot net
7 年前
看起来 [opcache.enable] 设置确实不是 PHP_INI_ALL。
在全局级别禁用时,在 user.ini 中更改它不会产生任何效果。user.ini 针对该设置被忽略。
1
JReezy
3 个月前
尽管 opcache.max_accelerated_files 的值集包含值 1048793,但如上所述,最大值为 1000000。如果您选择大于 1000000 的数字,该值将设置为其默认值 10000。
0
daniel at elementor dot com
2 个月前
当 opcache.use_cwd=0 时,从不同目录中进行的相对路径的 include/require 将都解析为同一个(第一个)文件。

示例目录结构
app1
index.php
lib.php
app2
index.php
lib.php

两个 index.php(s)
include "lib.php";

app1/lib.php
echo "app1";

app2/lib.php
echo "app2";

两者都将输出 "app1"。
-20
BR
8 年前
opcache.max_wasted_percentage 的值必须在 1 到 50 之间。否则,它将自动将变量设置为 5%。
To Top