OPcache 是一种现代 PHP 加速器,它通过将预编译的脚本字节码存储在共享内存中来提高 PHP 应用程序的性能。这减少了每次请求时需要重新解析和编译脚本的需求,从而显著加快了代码执行速度。
使用 OPcache
安装与启用
大多数现代 PHP 版本默认已包含 OPcache 扩展,但你可能需要手动启用它。可以通过编辑 php.ini
文件来配置 OPcache:
[opcache]
zend_extension=opcache.so ; 对于 Windows 系统可能是 opcache.dll
opcache.enable=1 ; 启用 OPcache
opcache.enable_cli=1 ; 可选:为 CLI 版本的 PHP 启用 OPcache
opcache.memory_consumption=128 ; 分配给 OPcache 的共享内存大小(MB)
opcache.interned_strings_buffer=8 ; 内部字符串缓冲区大小(MB)
opcache.max_accelerated_files=4000 ; 最大缓存文件数
opcache.revalidate_freq=60 ; 多久检查一次脚本更新(秒),0 表示每次都检查
opcache.fast_shutdown=1 ; 启用快速关闭序列以加速资源释放
重启 Web 服务器或 PHP-FPM 服务使配置生效。
验证安装
可以通过创建一个包含 phpinfo();
的 PHP 文件,并访问该文件来验证 OPcache 是否正确安装和配置。查找页面中的 “opcache” 部分确认其状态。
使用场景
- 高流量网站:对于经常接收大量请求的应用程序,减少每次请求时的编译时间可以大幅提高响应速度。
- 复杂应用:当应用程序由大量 PHP 文件组成时,OPcache 能够有效降低 I/O 操作次数,因为脚本已经被加载到内存中。
- 开发环境:虽然在开发环境中频繁更改代码,但如果设置了合理的 revalidate_freq 值,也可以从中受益而不影响开发流程。
底层原理
-
字节码缓存:PHP 源代码首先被编译成中间表示形式,即字节码。OPcache 将这些字节码保存在共享内存中,使得后续请求可以直接从内存中读取并执行,而无需再次编译源代码。
-
共享内存:利用操作系统的共享内存机制,允许多个 PHP 进程共享同一个字节码缓存实例,减少了内存占用并提高了缓存命中率。
-
自动重载:通过设置
opcache.revalidate_freq
参数,可以控制 OPcache 检查脚本是否发生变化的时间间隔。如果检测到变化,则会重新编译并将新版本放入缓存中。 -
优化与优化级别:OPcache 提供了几种不同的优化级别(通过
opcache.optimization_level
设置),可以在字节码生成过程中应用各种优化技术,如函数内联、常量折叠等,进一步提升执行效率。
通过合理配置和使用 OPcache,可以显著提升 PHP 应用程序的执行效率,特别是在处理高并发请求时表现尤为明显。定期监控 OPcache 的性能指标,并根据实际情况调整配置参数,是保持最佳性能的关键。