CentOS 上提升 PHP 代码执行效率的实用优化方案
一 运行环境与 OPcache 优化
- 升级到PHP 8.0+(或至少PHP 7.4+),新版本在JIT与性能修复方面收益明显。
- 启用并正确配置OPcache(推荐在生产环境关闭文件时间戳校验,开发环境保持校验便于热更新):
- 安装扩展:sudo yum install -y php-opcache
- 配置示例(/etc/php.d/10-opcache.ini 或 php.ini):
- opcache.enable=1
- opcache.memory_consumption=128
- opcache.interned_strings_buffer=8
- opcache.max_accelerated_files=4000
- opcache.validate_timestamps=0(生产)/ 1(开发)
- 在 PHP 8.x 上启用 JIT(需先启用 OPcache):
- opcache.jit=1235
- opcache.jit_buffer_size=256M
- 验证:php -r “echo json_encode(opcache_get_status());” 查看 jitted_functions_count 是否大于 0。
- 精简扩展加载:php -m 查看已启用模块,禁用不必要的扩展(每次变更后重启 PHP-FPM 并回归测试)。
二 PHP-FPM 进程与请求管理
- 进程管理模式选择:
- ondemand:空闲不保活,节省内存,适合波动/低并发。
- dynamic:按需伸缩,通用场景。
- static:常驻固定进程,适合稳定高并发。
- 关键参数建议(示例为 2GB 内存、2–4 核通用场景,需按实际压测微调):
- pm = dynamic
- pm.max_children = 50(上限由内存与单进程 RSS 推算)
- pm.start_servers = 4
- pm.min_spare_servers = 2
- pm.max_spare_servers = 6
- pm.max_requests = 500–1000(防内存泄漏/循环引用累积)
- request_terminate_timeout = 30(脚本硬超时)
- 慢日志:slowlog = /var/log/php-fpm/slow.log,request_slowlog_timeout = 10(定位慢请求与慢 SQL)
- 监听与权限:优先使用 Unix Socket(如:/run/php/php{version}-fpm.sock),并设置正确的 listen.owner / listen.group 与 user / group 以匹配 Nginx/Apache 运行用户,减少权限切换开销。
三 代码与数据层优化
- 缓存策略:对热点数据使用 Redis/Memcached,典型模式“Cache-Aside”:
- $redis = new Redis(); $redis->connect(‘127.0.0.1’, 6379);
- $key = ‘data’; $data = $redis->get($key) ?: ($redis->setex($key, 3600, fetchData()));
- 数据库:为高频查询建立索引,避免N+1 与全表扫描;减少循环内查询;合理使用持久连接(PDO::ATTR_PERSISTENT)降低握手开销。
- 语言与算法:优先使用内置函数与合适的数据结构;将循环内不变计算外提;减少全局变量;在 PHP 7+ 使用类型声明提升可预测性与优化空间。
- 静态资源与传输:启用 CDN 与 Gzip,设置合适的浏览器缓存策略,降低后端 PHP 与带宽压力。
四 快速自检与上线清单
- 验证与观察:
- OPcache:php -r “var_dump(opcache_get_status()[‘opcache_enabled’]);” 应为 true;JIT 场景检查 jitted_functions_count。
- FPM:systemctl status php-fpm;查看 /var/log/php-fpm/error.log 与 slow.log 是否有异常/慢请求。
- Web 服务:Nginx/Apache 访问日志与错误日志,确认 502/504 与超时是否减少。
- 上线前压测与容量评估:
- 逐步提升并发,观察 CPU/内存/请求耗时 与 排队,据此微调 pm.max_children / pm.start_servers / spare_servers 与超时阈值。
- 持续监控与回归测试,确保功能与性能稳定。