
在 PHP 开发中,性能优化始终是一个绕不开的话题。随着 PHP 7.4 的发布,OPcache 引入了一个全新的特性——opcache.preload,这一功能旨在进一步提升 PHP 应用的性能。本文搬主题将深入探讨 opcache.preload 的工作原理、配置方法,并同时加入WordPress加速优化等示例,通过实际测试评估其性能提升效果。
OPcache 简介
OPcache 是 PHP 的一个扩展,用于缓存已编译的 PHP 脚本,从而避免每次请求时重复编译代码,显著提升 PHP 脚本的执行效率。OPcache 通过将 PHP 脚本编译成字节码并缓存到共享内存中,使得后续请求可以直接使用缓存中的字节码,而无需重新编译。
opcache.preload 的工作原理
opcache.preload 是 OPcache 在 PHP 7.4 中引入的一个新特性,它允许在 PHP 进程启动时预加载一组 PHP 文件到 OPcache 中。这些预加载的文件在后续的请求中可以直接使用,而无需再次编译。
具体来说,opcache.preload 的工作流程如下:
- 预加载阶段:在 PHP 进程启动时,OPcache 会根据配置的预加载脚本列表,将这些脚本编译成字节码并缓存到共享内存中。
- 请求处理阶段:当接收到请求时,如果请求的脚本已经在预加载列表中,OPcache 直接使用缓存中的字节码,而无需再次编译。
- 自动刷新:如果预加载的脚本发生更改,OPcache 会自动重新加载这些脚本,确保缓存中的字节码是最新的。
配置 opcache.preload
要启用 opcache.preload,需要在 PHP 配置文件中进行相应的设置。以下是一个典型的配置示例:
其中,opcache.preload 指定了预加载脚本的路径,preload.php 是一个自定义脚本,用于列出要预加载的文件。
preload.php 示例
在 preload.php 中,我们可以使用 opcache_compile_file() 函数来预加载具体的 PHP 文件。需要注意的是,预加载的文件必须是 PHP 脚本,并且不能包含任何输出或副作用。
不同 PHP 版本的性能表现
- PHP 7.2:不支持 OPcache Preload,性能提升有限,仅能利用 OPcache 缓存已编译的字节码。
- PHP 7.4:引入 OPcache Preload,性能显著提升,特别是在预加载大量文件时。
- PHP 8.0 及更高版本:进一步优化 OPcache Preload,性能更佳,可能包含更多的内存管理和执行优化。
在WordPress中的加速应用
创建一个 preload.php 文件,放到WordPress网站的根目录,里面的代码为:
以上文件是搬主题进行了测试,然后对于WordPress基本没影响的,如果加载了太多核心文件,会导致WordPress后台及前台崩溃。
然后打开PHP的php.ini文件,添加如下代码(前提是已经开启了opcache,具体开启及配置方法参考本文前面一些的典型的配置示例):
其中/path/to/preload.php要改为自己的文件绝对路径,比如/home/www/preload.php等,然后保存。记得保存后重启PHP进程或者重启服务器。
注意:当然也可以多加载一些脚本,比如插件或者主题的一些内容,但是要考虑会不会对网站造成影响,自行测试。
为了评估 opcache.preload 的性能提升效果,搬主题进行了一系列测试。测试环境如下:
- 硬件配置:
- CPU:Intel Xeon E5-2620 v4 @ 2.10GHz
- 内存:32GB DDR4
- 磁盘:NVMe SSD
- 软件配置:
- 操作系统:Ubuntu 20.04 LTS
- Web 服务器:Apache 2.4.41
- PHP 版本:PHP 7.4.3
- 数据库:MySQL 8.0.21
- 测试工具:
- Apache Benchmark (ab)
- 黑盒测试框架:JMeter
我们选择一个典型的 PHP 应用(例如,WordPress系统)作为测试对象,该应用使用 Composer 管理依赖,并包含多个控制器和模型文件。
- 基准测试:关闭 OPcache,测量应用的响应时间。
- OPcache 启用测试:启用 OPcache,但不启用
opcache.preload,测量响应时间。 - OPcache + Preload 测试:启用 OPcache 并配置
opcache.preload,测量响应时间。
从测试结果可以看出,搬主题启用 opcache.preload 后,应用的平均响应时间从 80ms 降低到 60ms,每秒请求数从 125 提升到 166,性能提升约 33%。
opcache.preload 的性能提升主要体现在以下几个方面:
- 减少编译时间:通过预加载常用脚本,减少了每次请求时的编译时间,特别是在脚本数量较多时,效果更为显著。
- 降低内存碎片:预加载机制可以更有效地管理内存,减少内存碎片,提高内存利用率。
- 加快请求响应:由于脚本已经编译并缓存,请求处理速度更快,提升了整体性能。
然而,需要注意的是,opcache.preload 并不适用于所有场景。例如,对于动态生成的脚本或频繁更改的代码,预加载可能会带来不必要的开销。因此,在实际应用中,需要根据具体情况进行权衡和配置。
- 显著提升性能:特别是在高并发场景下,性能提升明显。
- 简化配置:通过预加载脚本,减少了运行时的编译开销。
- 兼容性好:适用于大多数 PHP 应用,尤其是使用 Composer 管理依赖的应用。
- 配置复杂:需要编写预加载脚本,并确保预加载的文件无副作用。
- 内存消耗:预加载会占用更多的共享内存,需要根据应用规模进行调整。
- 不适用于动态脚本:对于频繁更改的脚本,预加载可能带来负面影响。
- 合理选择预加载脚本:只预加载那些频繁使用的、稳定的脚本文件。
- 避免副作用:确保预加载的脚本没有输出或其他副作用,否则可能导致不可预测的行为。
- 监控内存使用:定期监控 OPcache 的内存使用情况,避免内存不足导致性能下降。
- 结合其他优化手段:如使用 APCu、数据库连接池等,进一步提升应用性能。
opcache.preload 是 PHP 7.4 引入的一个强大功能,通过预加载常用脚本,显著提升了 PHP 应用的性能。对于大多数 PHP 应用来说,合理配置和使用 opcache.preload 可以带来明显的性能提升。然而,也需要注意其适用场景和配置细节,以避免潜在的问题。
通过搬主题的介绍和评测,希望大家能够对 opcache.preload 有一个全面的了解,并在实际开发中加以应用,进一步优化 PHP 应用的性能。
购买/下载遇到问题?可联系
闲鱼名称:三点水帅哥
客服邮箱:382813125@qq.com
安装、使用问题,请先查看:技术支持说明
本文由 wpwdbfg 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Mar 27, 2026 at 11:35 pm