当前位置:首页 >  站长 >  建站经验 >  正文

OPcache调优:一行php -m查缺失,六个参数把PHP提速一倍

 2026-09-11 10:58  来源: 互联网   我来投稿 撤稿纠错

  一键部署OpenClaw

很多站长不知道一个事实:你的 PHP 站点每处理一个请求,都会把涉及的 PHP 文件从头到尾重新编译一遍——词法分析、语法解析、编译成字节码,然后执行完就扔。下一个请求再来,同样的文件再编译一遍。WordPress 一跑起来就是几十上百个 PHP 文件,这些编译开销占了整个请求时间的相当一部分。OPcache 要做的事很简单:把编译好的字节码放进内存,下次请求直接用,跳过编译环节。这是 PHP 性能优化里少有的“零风险、纯赚”项,装上就有收益。

第一步先查装没装。命令行敲:

php -m | grep -i opcache

# 输出 Zend OPcache 说明已启用

# 没输出就需要安装(Ubuntu/Debian示例):

sudo apt install php8.3-opcache

sudo systemctl restart php8.3-fpm

有个反直觉的点:OPcache 自 PHP 5.5 起就内置了,但默认可能没开。某些发行版的 CLI 模式和 FPM 模式配置是分开的,命令行查到了不代表 FPM 进程也在用。所以装没装、开没开、生效没生效,都要在 Web 环境里确认一次。

确认方法是在网站根目录临时放一个 info.php(查完立刻删):

<?php

// info.php —— 查完删掉,别留在生产环境

$status = opcache_get_status();

echo $status ? "OPcache 已启用, 缓存了 " . count($status['scripts']) . " 个脚本"

: "OPcache 未启用";

接下来是调优主体。编辑 PHP 的 FPM 配置文件(一般在 /etc/php/8.3/fpm/php.ini),找到 [opcache] 段,改成下面这套适合生产环境的配置:

[opcache]

; 字节码内存池,小站64M够用,WordPress建议256M

opcache.memory_consumption=256

; 内部字符串暂存池

opcache.interned_strings_buffer=32

; 最多缓存多少个PHP文件,wp+插件常见2000-5000个

; 按项目文件数1.5倍往上取整

opcache.max_accelerated_files=20000

; 生产环境关键项:不检查文件更新时间

; 字节码常驻内存,文件改了也不重新编译,性能最好

opcache.validate_timestamps=0

; 时间戳校验频率(秒),validate_timestamps=1时的兜底

opcache.revalidate_freq=60

; JIT(PHP 8.0+),CPU密集型场景有收益

opcache.jit=tracing

opcache.jit_buffer_size=64M

重点解释 validate_timestamps 这一项,它是整套配置里收益最大也最危险的一个。设为 0,PHP 完全不再检查源文件有没有更新,所有请求都走内存里的字节码,性能最优。但代价是:你改了 PHP 文件,站点不会有任何变化——必须手动重启 FPM 才能生效。所以这套配置的使用纪律是:生产环境日常保持 0,每次部署完代码跟着执行 systemctl reload php8.3-fpm,把它变成发布流程的固定一步。如果你习惯改完文件立刻看效果、又不想依赖重启,那就设 1 并把 revalidate_freq 控制在 60 秒以内,损失一丁点性能换省心。

JIT 那两项看情况。jit=tracing 开启动态追踪编译,热点代码会被编译成机器码直接执行。对 WordPress 这类典型 IO 密集型站点,JIT 带来的提升有限(百分之几到十几),但内存开销是实打实的。跑 WordPress 可以先开着观察,如果服务器内存紧张,把 jit_buffer_size 设为 0 关掉也无妨;跑大量数学计算、图片处理的脚本,JIT 收益才明显。

改完重启 FPM,验证优化效果,用 ab 简单压测对比:

# 调优前先测一次基线(100请求,并发10)

ab -n 100 -c 10 https://example.com/ | grep "Time per request"

# 改完php.ini重启后测第二次

sudo systemctl restart php8.3-fpm

ab -n 100 -c 10 https://example.com/ | grep "Time per request"

# 也可以确认缓存填充情况

curl -s https://example.com/info.php

# 期望:OPcache 已启用, 缓存了 xxxx 个脚本

# 跑一段时间后如果文件数接近 max_accelerated_files,就该调大

收尾提醒三件事。第一,info.php 验证完立刻删,这种文件留在生产环境等于把服务器内部信息公开。第二,OPcache 的内存是每个 FPM worker 独立占用的吗——不是,它是共享内存,整个 FPM 池共用一份 256M,不用担心内存翻倍。第三,和 249 篇的页面缓存是两层不同的东西:OPcache 缓存的是代码编译结果,页面缓存存的是最终 HTML,一个在 PHP 内部一个在 PHP 前面,两层叠着开才是完整姿势。

相关阅读:本篇属于《性能与安全加固总清单:按这张表打勾,新站48小时达到生产水准》的性能组,PHP 层提速三件套里它是最后一块,照总纲打勾别漏项。

申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!

相关标签
OPcache调优

相关文章

热门排行

信息推荐