温馨提示×

ubuntu php-fpm为啥慢

小樊
48
2026-09-28 13:45:05
栏目: 编程语言

在 Ubuntu 上 PHP-FPM 慢 的原因通常可以归为几大类:配置不合理、资源瓶颈、代码问题、系统/环境限制。下面按常见程度给你梳理,并给出排查方法。


一、PHP-FPM 配置问题(最常见)

1. pm 模式设置不合理

PHP-FPM 有三种进程管理方式:

  • static
  • dynamic(默认)
  • ondemand

常见错误:

  • 并发高但 pm.max_children 太小 → 请求排队
  • ondemand 在突发流量时启动慢

查看:

grep -R "pm" /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

2. 请求在排队(关键指标)

看 PHP-FPM 状态页或日志:

sudo tail -f /var/log/php*-fpm.log

如果有:

server reached pm.max_children

说明 进程不够用。


二、CPU / 内存瓶颈

1. CPU 跑满

top
htop

PHP 慢通常表现为:

  • php-fpm 进程 CPU 高
  • load average 高

可能原因:

  • 死循环
  • 正则太复杂
  • 大量计算

2. 内存不足导致 swap

free -h
swapon --show

如果开始用 swap,PHP-FPM 会明显变慢。


三、PHP 代码本身慢(非常常见)

1. 慢日志(强烈推荐开启)

编辑:

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

开启:

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

重启:

systemctl restart php*-fpm

然后看:

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

能直接看到 哪一行代码慢。


2. 常见问题代码

  • 数据库没加索引
  • file_get_contents() 外网请求
  • 循环里查数据库
  • json_encode/decode 大数据
  • 使用了 sleep()

四、数据库慢(经常被误以为是 PHP 慢)

检查 MySQL 慢查询

sudo tail -f /var/log/mysql/mysql-slow.log

或:

SHOW PROCESSLIST;

五、Ubuntu 系统层问题

1. 磁盘 IO 慢

iostat -x 1

如果是云服务器:

  • 低配云盘
  • 大量写日志

2. OPcache 没开(PHP 性能关键)

php -m | grep opcache

如果没有:

sudo apt install php-opcache

确认:

opcache.enable=1
opcache.memory_consumption=128

3. 文件描述符限制

ulimit -n

太低会导致连接失败或变慢。


六、网络 / 代理问题

  • Nginx → PHP-FPM 用 socket 比 TCP 快
listen = /run/php/php-fpm.sock
  • 反向代理(Cloudflare、CDN)延迟
  • DNS 解析慢

七、快速自查清单 ✅

你可以按顺序查:

  1. ✅ php-fpm.log 有没有 max_children
  2. ✅ 开 slowlog
  3. ✅ top 看 CPU
  4. ✅ free -h 看内存
  5. ✅ 数据库慢查询
  6. ✅ OPcache 是否开启
  7. ✅ 是否用 unix socket

如果你愿意,可以告诉我:

  • Ubuntu 版本
  • PHP 版本
  • 用的 Nginx 还是 Apache
  • 是接口慢还是页面慢

我可以直接帮你 看配置、给优化方案。

0 踩