温馨提示×

ubuntu php-fpm为何响应变慢

小樊
46
2026-09-10 09:14:19
栏目: 编程语言

在 Ubuntu 上 PHP-FPM 响应变慢通常是多个因素叠加的结果。下面按常见原因 → 排查方式 → 解决建议来系统说明。


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

1. 进程数不足(请求排队)

PHP-FPM 使用 pm 模式管理进程:

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

如果并发请求 > pm.max_children,请求就会排队,表现为:

  • 响应时间突然变长
  • 某些请求 5–10 秒才返回

排查

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

看到类似:

server reached pm.max_children

解决

  • 提高 pm.max_children
  • 或改为:
pm = static
pm.max_children = 20

2. request_terminate_timeout 设置不合理

request_terminate_timeout = 30s

如果脚本执行慢,会被杀掉或阻塞。


二、慢日志(非常重要)

PHP-FPM 自带慢执行日志

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

重启后:

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

你会看到:

  • 哪个 PHP 文件
  • 哪一行
  • 执行超过多少秒

✅ 这是定位“代码慢”的最直接方式


三、PHP 代码本身慢

常见问题:

  • 无缓存的数据库查询
  • 循环里查数据库
  • 外部 API 同步调用
  • file_get_contents(http://...)
  • 大量 json_encode/decode

建议

  • 开启 OPcache
  • 使用 Redis / Memcached
  • 异步任务(队列)

四、数据库是瓶颈(非常常见)

即使 PHP 很快,MySQL 慢也会让 FPM 看起来慢。

排查

SHOW PROCESSLIST;

或开启:

slow_query_log = 1
long_query_time = 1

解决

  • 加索引
  • 避免 SELECT *
  • 减少联表

五、Ubuntu 系统资源问题

1. 内存不足(OOM / swap)

free -h

如果大量使用 swap,PHP-FPM 会非常慢。


2. CPU 被打满

top
htop

看是不是:

  • PHP
  • MySQL
  • 其他进程

3. 磁盘 IO 高

iostat -x 1

日志写太多、session 文件频繁读写会导致变慢。


六、Session / 文件锁问题

默认:

session.save_handler = files

高并发时:

  • session 文件锁
  • /var/lib/php/sessions IO 高

建议

session.save_handler = redis

七、Nginx ↔ PHP-FPM 通信问题

Unix Socket 还是 TCP?

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

检查:

  • socket 权限
  • nginx fastcgi 配置

八、PHP 版本 / 扩展问题

  • 升级 PHP 后未启用 OPcache
  • Xdebug 忘记关(极其常见)
; 生产环境必须关
xdebug.mode=off

九、快速排查清单(建议顺序)

  1. php-fpm.log 看是否 max_children
  2. slowlog
  3. SHOW PROCESSLIST
  4. top / free / iostat
  5. 确认 Xdebug 关闭
  6. 确认 OPcache 开启

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

  • Ubuntu 版本
  • PHP 版本
  • 使用的 Web 服务(Nginx/Apache)
  • 是否高并发
  • 是否突然出现还是逐渐变慢

我可以帮你精准定位并给出配置示例

0