2024年PHP开发者大会日本站

运行时配置

这些函数的行为受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 布尔型

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

opcache.enable_cli 布尔型

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

opcache.memory_consumption 整型

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

opcache.interned_strings_buffer 整型

用于存储内部字符串的内存量(以兆字节为单位)。在64位架构上最大值为32767,在32位架构上最大值为4095。

注意在PHP 8.4.0之前,所有架构上的最大值均为4095兆字节。

opcache.max_accelerated_files 整型

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

opcache.max_wasted_percentage 整型

如果可用空闲内存不足,则在计划重新启动之前允许的浪费内存的最大百分比。最大允许值为"50",如果设置更大的值,则强制执行该值。

opcache.use_cwd 布尔型

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

opcache.validate_timestamps 布尔型

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

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

opcache.revalidate_freq 整型

检查脚本时间戳以进行更新的频率(以秒为单位)。0表示OPcache将在每次请求时检查更新。

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

opcache.revalidate_path 布尔型

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

opcache.save_comments 布尔型

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

opcache.fast_shutdown 布尔型

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

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

opcache.enable_file_override 布尔型

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

opcache.optimization_level 整型

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

opcache.inherited_hack bool

此配置指令被忽略。

opcache.dups_fix bool

此 hack 仅应在解决“无法重新声明类”错误时启用。

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

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

opcache.file_cache string

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

opcache.file_cache_only bool

启用或禁用共享内存中的操作码缓存。

注意:

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

opcache.file_cache_consistency_checks bool

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

opcache.file_cache_fallback bool

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

警告

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

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:如果 CPU 支持,则启用 AVX 的使用。
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

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

添加注释

用户贡献注释 7 条注释

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

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

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

opcache.mmap_base = 0x20000000

不幸的是,我不知道值“0x20000000”的意义。我只知道这个值可以解决问题(经过测试)。
carneiro at isharelife dot com dot br
4 年前
如果您尝试使用 opcache.memory_consumption 分配超过可用内存的内存,则 PHP 会停止工作,没有任何日志可以帮助调试。在创建具有相同配置且可用内存少于生产服务器的登台服务器时,这个问题花了我 4 个小时才解决。
wessos at example dot org
5 年前
截至 php 7.3,优化级别如下:

#define ZEND_OPTIMIZER_PASS_1 (1<<0) /* CSE,字符串构造 */
#define ZEND_OPTIMIZER_PASS_2 (1<<1) /* 常量转换和跳转 */
#define ZEND_OPTIMIZER_PASS_3 (1<<2) /* ++,+=,一系列跳转 */
#define ZEND_OPTIMIZER_PASS_4 (1<<3) /* INIT_FCALL_BY_NAME -> DO_FCALL */
#define ZEND_OPTIMIZER_PASS_5 (1<<4) /* 基于 CFG 的优化 */
#define ZEND_OPTIMIZER_PASS_6 (1<<5) /* 基于 DFA 的优化 */
#define ZEND_OPTIMIZER_PASS_7 (1<<6) /* 调用图优化 */
#define ZEND_OPTIMIZER_PASS_8 (1<<7) /* SCCP(常量传播)*/
#define ZEND_OPTIMIZER_PASS_9 (1<<8) /* TMP VAR 使用 */
#define ZEND_OPTIMIZER_PASS_10 (1<<9) /* NOP 删除 */
#define ZEND_OPTIMIZER_PASS_11 (1<<10) /* 合并相等常量 */
#define ZEND_OPTIMIZER_PASS_12 (1<<11) /* 调整使用的堆栈 */
#define ZEND_OPTIMIZER_PASS_13 (1<<12) /* 删除未使用的变量 */
#define ZEND_OPTIMIZER_PASS_14 (1<<13) /* DCE(死代码消除)*/
#define ZEND_OPTIMIZER_PASS_15 (1<<14) /* (不安全)收集常量 */
#define ZEND_OPTIMIZER_PASS_16 (1<<15) /* 内联函数 */

来源:https://lxr.room11.org/xref/php-src%40master/ext/opcache/Optimizer/zend_optimizer.h
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 缓存,但速度较慢,因为它会在每次请求时检查文件是否已更改)。
bdurand at ensemblegroup dot net
7 年前
[opcache.enable] 设置似乎确实不是 PHP_INI_ALL。
在全局级别禁用时,在 user.ini 中更改它不会产生任何效果。user.ini 将忽略该设置。
JReezy
7 个月前
尽管 opcache.max_accelerated_files 的值集包括值 1048793,但如前所述,最大值为 1000000。如果您选择大于 1000000 的数字,则该值将设置为其默认值 10000。
daniel at elementor dot com
6 个月前
当 opcache.use_cwd=0 时,来自不同目录的相对路径的 include/require 都将解析为同一个(第一个)文件。

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

index.php(所有)
include "lib.php";

app1/lib.php
echo "app1";

app2/lib.php
echo "app2";

两者都将输出 "app1"。
To Top