建了 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 也能跑出流畅的访问体验。
