温馨提示×

ubuntu php-fpm为什么慢

小樊
37
2026-09-07 11:06:41
栏目: 编程语言

在 Ubuntu 上 PHP-FPM 慢 的原因通常可以归为几大类:配置问题、资源瓶颈、代码问题、系统/运维问题。下面我按“最常见 → 较少见”给你一个系统排查思路。


一、最常见原因(90% 的情况)

1. 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_children
  • 或改成:
pm = static
pm.max_children = 20~50(根据内存)

2. 请求被阻塞(CPU / IO)

查看系统资源:

top
htop
iotop

常见问题:

  • CPU 100%(死循环、正则、序列化)
  • 磁盘 IO 高(日志、session、文件缓存)
  • 内存不足导致 swap

3. PHP 代码本身慢

用 Xdebug / Tideways / Blackfire 或最简单:

echo microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'];

常见慢点:

  • 数据库慢查询
  • 外部 API(curl 超时)
  • 文件读写
  • 框架自动加载过多

二、Ubuntu + PHP-FPM 特有原因

4. OPCache 没开

PHP 7+ 必须开 OPCache。

检查:

php -i | grep opcache

应看到:

opcache.enable => On

开启:

opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000

5. PHP-FPM socket 而不是 TCP(或反过来)

Ubuntu 默认:

listen = /run/php/php-fpm.sock

Nginx 配置要匹配:

fastcgi_pass unix:/run/php/php-fpm.sock;

常见于:

  • Nginx 用 TCP,PHP-FPM 用 socket
  • 权限问题导致等待

6. DNS 解析慢(非常隐蔽)

PHP 中:

gethostbyname()
mail()
curl()

如果 DNS 慢,会卡死。

测试:

dig example.com

三、系统级原因

7. Swap 被频繁使用

free -h
swapon --show

解决:

  • 增加内存
  • 限制 pm.max_children

8. 磁盘满了

df -h

PHP-FPM 日志、session 写不进去会卡。


9. PHP 版本太老

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

五、如果你愿意,我可以更精准帮你

你可以直接贴:

  1. Ubuntu 版本
  2. PHP 版本
  3. www.conf 配置
  4. 是否有 Nginx / Apache
  5. 慢的具体表现(首页?接口?后台?)

我可以一步一步帮你定位到具体是哪一行配置或代码慢。

0 踩