在 Ubuntu 上 PHP-FPM 慢 的原因通常可以归为几大类:配置问题、资源瓶颈、代码问题、系统/运维问题。下面我按“最常见 → 较少见”给你一个系统排查思路。
PHP-FPM 使用 pool(进程池),如果并发请求超过 pm.max_children,就会排队。
查看配置:
sudo vim /etc/php/*/fpm/pool.d/www.conf
关键参数:
pm = dynamic
pm.max_children = 5 # 太小
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
现象:
php-fpm.log 里有:server reached pm.max_children setting
解决:
pm.max_childrenpm = static
pm.max_children = 20~50(根据内存)
查看系统资源:
top
htop
iotop
常见问题:
用 Xdebug / Tideways / Blackfire 或最简单:
echo microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'];
常见慢点:
PHP 7+ 必须开 OPCache。
检查:
php -i | grep opcache
应看到:
opcache.enable => On
开启:
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
Ubuntu 默认:
listen = /run/php/php-fpm.sock
Nginx 配置要匹配:
fastcgi_pass unix:/run/php/php-fpm.sock;
常见于:
PHP 中:
gethostbyname()
mail()
curl()
如果 DNS 慢,会卡死。
测试:
dig example.com
free -h
swapon --show
解决:
pm.max_childrendf -h
PHP-FPM 日志、session 写不进去会卡。
Ubuntu 自带 PHP 可能很老(如 7.2/7.4)
升级:
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php8.2-fpm
# 1. 看 php-fpm 状态
sudo systemctl status php*-fpm
# 2. 看进程数
ps aux | grep php-fpm
# 3. 看日志
sudo tail -f /var/log/php*-fpm.log
# 4. 看 nginx 错误
sudo tail -f /var/log/nginx/error.log
# 5. 看慢日志(很重要)
slowlog = /var/log/php-fpm-slow.log
request_slowlog_timeout = 2s
你可以直接贴:
www.conf 配置我可以一步一步帮你定位到具体是哪一行配置或代码慢。