温馨提示×

Ubuntu PHP-FPM为何慢

小樊
39
2026-07-13 20:39:33
栏目: 编程语言

Ubuntu 下 PHP-FPM 响应慢通常不是单一原因,而是 配置、资源、代码、系统环境 叠加的结果。下面按最常见 → 较少见的顺序给你系统性排查思路,并给出可直接操作的优化建议。


一、最常见原因(90% 问题在这里)

1️⃣ PHP-FPM 进程数配置不合理(最常见)

典型现象

  • 并发稍高就变慢
  • 单请求快,多请求慢
  • top 里 php-fpm 进程很多或很少

检查配置

/etc/php/*/fpm/pool.d/www.conf

重点参数:

pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20

如何判断不够?

ps aux | grep php-fpm | wc -l

如果接近 pm.max_children进程不够

✅ 建议:

  • pm.max_children 估算公式:
max_children ≈ 可用内存 / 单个 php-fpm 进程内存

例如:

  • 服务器 4G
  • 一个 php-fpm 约 60MB
  • 理论值 ≈ 60

2️⃣ OPCache 未开启或配置过小

检查

php -i | grep opcache

推荐配置

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=32
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0

✅ 开启后通常 提升 30%~50%


3️⃣ PHP 慢日志(直接定位慢函数)

开启慢日志

slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 2s

查看

tail -f /var/log/php-fpm/www-slow.log

✅ 如果看到:

  • DB 查询
  • file_get_contents
  • curl
  • 循环

那就是 代码问题


二、系统 & 资源问题

4️⃣ CPU / 内存 / IO 被占满

快速排查

top
htop
iotop
free -h

常见问题:

  • MySQL 吃满 CPU
  • 磁盘 IO 爆满
  • SWAP 被使用(非常慢)

✅ 如果看到 swap 使用:

swapoff -a

5️⃣ Ubuntu 系统级限制

文件描述符不足

ulimit -n

建议:

/etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

三、Web 服务 & 架构问题

6️⃣ PHP-FPM + Nginx 配置不匹配

Nginx fastcgi 参数

fastcgi_read_timeout 120;

Unix socket 比 TCP 快

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

7️⃣ 数据库慢(不是 PHP 慢)

判断方法

  • 直接访问 PHP 接口慢
  • php -r "echo 1;" 很快

✅ 检查:

  • MySQL 慢查询日志
  • 是否缺少索引
  • 是否有 select * 大表

四、代码 & 框架问题

8️⃣ Laravel / ThinkPHP 等框架本身慢

常见原因:

  • 每次请求加载大量文件
  • 中间件过多
  • debug 模式未关闭

✅ 检查:

APP_DEBUG=false

9️⃣ 外部请求阻塞(致命)

例如:

  • curl 访问第三方 API
  • file_get_contents()
  • DNS 解析慢

✅ 解决:

  • 设置超时
  • 异步化
  • 使用缓存

五、快速自检清单(5 分钟定位)

✅ 按顺序执行:

# 1. 是否开启 opcache
php -i | grep opcache.enable

# 2. 是否进程不够
ps aux | grep php-fpm | wc -l

# 3. 是否有慢日志
tail /var/log/php-fpm/www-slow.log

# 4. 是否 CPU / IO 爆满
top

六、如果你愿意,我可以直接帮你分析

你可以直接贴出:

  1. Ubuntu 版本
  2. PHP 版本
  3. www.conf 配置
  4. 是否 Laravel / TP / 原生
  5. 接口慢 还是 页面慢

我可以 直接给你一份优化后的配置,而不是泛泛而谈。

0