opcache 是什么?
opcache 是 php 的官方推出的字节码缓存器(zend opcache),通过将 php 脚本预编译的字节码存储在共享内存中来提升 php 的性能,在 php 5.5.0 及后续版本中已经绑定了 opcache 扩展,
缓存预编译字节码的好处就是避免重复解析和编译脚本,省去了每次加载和解析 php 脚本的开销,那么这一过程是如何实现的呢?
缓存字节码:php 脚本首次被执行的时候,zend 引擎会将代码转换为 抽象语法树(ast),再编译为 字节码(opcodes),opcache 扩展会拦截这一过程,将字节码存储在共享内存中,后续请求直接调用内存中的字节码,跳过重复编译的过程。
内存共享机制:opcache 使用共享内存(mmap 或 shm)存储字节码,所有 php 进程(如 php-fpm 子进程)共享同一份缓存,降低了内存的占用,相比其他方案,opcache 与 php 内核深度集成,效率更高。
所以 opcache 在下面几个关键点提升了性能:
cpu 节省:避免重复编译,降低 cpu 负载(尤其是 wordpress 这类动态脚本)。
i/o 优化:减少磁盘读取 .php 文件的次数(对机械硬盘效果显著)。
内存效率:字节码比原始 php 代码更紧凑,共享内存减少整体内存占用。
所以对于 wordpress 来说,就特别需要 opcache 了,因为 wordpress 每个页面请求都会加载大量 php 文件(主题、插件、核心),这样未优化的 wordpress 在流量高峰时容易因 php 编译拖慢响应。
如何启用 opcache?
php php 5.5.0 及后续版本默认包含 opcache,opcache 只能编译为共享扩展,如果你使用 –disable-all 参数 禁用了默认扩展的构建, 那么必须使用 –enable-opcache 选项来开启 opcache。
编译之后,就可以使用 zend_extension 指令来将 opcache 扩展加载到 php 中。在非 windows 平台使用 zend_extension=/full/path/to/opcache.so, windows 平台使用 zend_extension=c:\path\to\php_opcache.dll。
汇总一下在 php.ini 中添加下面代码:
zend_extension=opcache.so ;
linuxzend_extension=opcache.dll ;
windowsopcache.enable=1
针对 wordpress,可以加入这些专属优化配置:
[opcache]
opcache.enable=1
opcache.memory_consumption=256 ; wordpress 建议 ≥128mb
opcache.max_accelerated_files=10000 ; 覆盖 wordpress 核心 插件文件数
opcache.interned_strings_buffer=16 ; wordpress 大量重复字符串(如钩子名)
opcache.validate_timestamps=0 ; 生产环境关闭自动检查
opcache.revalidate_freq=0 ; 与 validate_timestamps=0 配合
opcache.save_comments=1 ; wordpress 依赖注释(如钩子文档)
opcache.enable_file_override=1 ; 覆盖 include/require 优化
安装好时候,如何检测验证安装成功了呢?
简单可以通过通过 phpinfo() 或命令行 php -v 查看是否加载。也可以在后台 「wpjam」主菜单下「系统信息」子菜单中的「服务器」标签中「php 扩展」看到:opcache:
当然最重要是「opcache」标签页:
这里也会罗列出 opcache 的一些状态,比如已用内存和剩余内存,以及他们之间百分率,命中率和未命中率,以及他们之间百分率等等数据,还有相关的饼图。
生产环境一般建议关闭 validate_timestamps,避免频繁检查文件修改,文件有更新的时候通过手动重启 opcache 或 php-fpm 来更新代码,也可以在上图中点击「刷新缓存」即可。
下面是一个简单 wordpress 站点在开启 opcache 前后的性能对比:
场景 | 未启用 opcache | 启用 opcache | 优化幅度 |
---|---|---|---|
ag真人官方网首页加载时间 | 800ms | 300ms | ↓62.5% |
后台管理页面 | 1200ms | 500ms | ↓58.3% |
并发请求(100 qps) | cpu 90% | cpu 45 | %↓50% |
所以可以看到启用 opcache 最高接近 300% 的提升。
php 代码使用 opcache 之后,可以提高代码的执行效率,特别是 wordpress 这类文件比较多的 cms 系统。