PHP 性能优化教程:PHP-FPM 参数调优、OPcache 开启与慢日志定位,网站秒开


建了 WordPress 或 Typecho 博客,网站加载慢、CPU 时不时飙高、偶发 502——除了数据库和 Nginx,很大一部分瓶颈在 PHP 本身。PHP 是动态解释执行的,默认配置往往偏保守。这篇文章教你从 PHP-FPM 进程管理、OPcache 缓存、慢日志排查三个层面优化 PHP,让网站在服务器配置不变的情况下明显提速。

一、PHP 性能瓶颈在哪

一个 PHP 网站每次请求,PHP-FPM 都要启动(或复用)一个 worker 进程,执行 PHP 脚本、连接数据库、渲染页面。常见瓶颈:

  • 进程池配置不合理:worker 数量太少排队,太多互相抢内存
  • 没开 OPcache:每次请求都重新编译所有 PHP 文件,浪费大量 CPU
  • 执行时间过长:某个脚本写得很慢,拖住了整个进程池
  • 内存被吃满:worker 进程太多撑爆内存,触发 OOM 或 502

下面逐一解决。

二、PHP-FPM 进程池调优

PHP-FPM 的配置在 php.ini 同级或 /etc/php/8.1/fpm/pool.d/www.conf(路径因版本而异)。核心是三组参数。

1. 进程管理模式:

; 推荐以运行为主的站点使用 dynamic
pm = dynamic

2. 进程数量(重点):

; 以 1 核 2G、跑 WordPress 的典型配置为例
pm.max_children = 20          ; 最多同时运行多少个 worker
pm.start_servers = 3          ; 启动时创建几个
pm.min_spare_servers = 2      ; 空闲时的最少个数
pm.max_spare_servers = 5      ; 空闲时的最多个数

max_children 是核心,估算公式:max_children ≈ 总内存 ÷ 单个 PHP 进程内存。假设 2G 内存、每个 PHP 进程约 80MB,max_children = 2000/80 ≈ 25,取 20 较稳妥。

设置过大会内存不足,过小会排队变慢。用 free -m 看内存,用 top 看 单个 php-fpm 进程占多少,根据实际调整。

3. 每个进程最大请求数:

; 处理 500 个请求后自动退出重建,防止内存泄漏累积
pm.max_requests = 500

三、开启 OPcache(性能提升最明显)

OPcache 把编译好的 PHP 字节码缓存到内存,省去每次请求重复编译,通常能带来 30%-200% 的提升。

在 php.ini 中开启并配置:

[opcache]
zend_extension=opcache
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128        ; 缓存内存大小
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000   ; 缓存文件数上限
opcache.revalidate_freq=60            ; 每 60 秒检查一次文件是否变化
opcache.fast_shutdown=1

验证是否开启:

php -m | grep Zend OPcache

或创建一个 info.php:

echo "<?php phpinfo();" > /www/wwwroot/你的站点/info.php

浏览器访问后搜 "OPcache",状态显示 enabled 即生效。(用完记得删除 info.php 避免暴露信息。)

注意: 开发环境为了改代码即时生效,可设 opcache.revalidate_freq=0;生产环境设大一点性能更好。改完重启 PHP-FPM:

systemctl restart php-fpm

四、开启慢日志,定位慢脚本

网站偶发卡顿,但不知道哪段代码慢,慢日志能帮你精准定位。

在 PHP-FPM 的 pool 配置里开启:

; 记录执行超过 5 秒的请求(不推荐太小的 <2s 会刷屏)
slowlog = /var/log/php-fpm-slow.log
request_slowlog_timeout = 5s
request_terminate_timeout = 60s   ; 防止卡死进程,超时强制终止

改完重启后,慢请求会记录在慢日志里:

cat /var/log/php-fpm-slow.log
# app: /www/wwwroot/example.com/wp-content/xxx.php
#   php 调用栈:能看到具体卡在哪个函数

根据调用栈,就能找到是哪个插件、哪段逻辑拖慢了网站,针对性优化或替换。

五、其他常用优化项

1. 上传大小限制(wordpress 传主题/图片失败时):

# php.ini 中
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
max_input_time = 300
memory_limit = 256M

2. 缩短 session 垃圾回收:

session.gc_probability = 1
session.gc_divisor = 1000

3. 数据库层面的配合: PHP 慢常常因为 SQL 慢,参考本站 SQL 调优教程,配合慢查询日志一起排查效果最好。

六、常见问题

Q1:改完配置不生效?

PHP-FPM 参数改完必须重启 php-fpm,php.ini 变化也要重启;另外某些面板(宝塔)通过面板改。

nginx -t && nginx -s reload
systemctl restart php-fpm

Q2:max_children 设大了反而 502?

worker 太多把内存耗尽,系统 OOM killer 杀进程导致 502。把 max_children 调小,或增加内存。

Q3:开了 OPcache 后改代码不生效?

默认缓存了文件,等 revalidate_freq 到期,或生产环境重新加载:

# 手动清除 OPcache 缓存
php -r "opcache_reset();"

开发环境建议临时设 opcache.revalidate_freq=0。

Q4:网站还是慢,怎么办?

PHP 只是其中一环。继续排查:Nginx 层面的缓存(proxy_cache)、数据库慢查询、磁盘 IO(参考本站磁盘 IO 教程)。三层一起优化,网站才能真正快起来。

总结

PHP 性能优化三板斧:合理配置 PHP-FPM 进程池、开启 OPcache、用慢日志定位慢脚本。把这三件事做好,大部分 PHP 网站的加载速度都会有质的提升。之后再结合 Nginx 缓存和数据库优化,一套组合下来,低配 VPS 也能跑出流畅的访问体验。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

Nginx 日志切割与清理教程:logrotate 自动轮转、定期归档,日志不再撑爆磁盘

磁盘 IO 慢排查与优化指南:iostat、hdparm 定位瓶颈,让磁盘不再拖后腿

评 论
更换验证码