PHP-FPM 进程 CPU 占用 100% 的问题中,通过设置 request_slowlog_timeout=5s 可捕获执行超过 5 秒的脚本调用栈,生产环境首次启用推荐此阈值。
原因分析
PHP-FPM 进程占用 CPU 过高的核心原因是某些 PHP 脚本执行时间过长或陷入死循环。根据 2025 年 6 月 11 日发布的技术文章,当一个 php-fpm 进程 CPU 占用率飙升到 99.9% 时,通常意味着它正在执行极其耗时或陷入死循环的 PHP 脚本。PHP-FPM 自带的慢日志 (Slow Log) 功能专门用来记录这些"慢动作"脚本,是排查问题最重要的线索来源。慢日志会记录进程号、脚本名称、具体哪个文件哪行代码的哪个函数执行时间过长,例如日志格式为:[日期时间] [pool www] pid 进程号 script_filename = 脚本文件,随后跟随调用栈信息如 [0x00007f2d286c2790] replace() /xxx/Plugin.php:72。
开启慢日志配置
需要在 PHP-FPM 池配置文件中启用两个关键参数。根据宝塔面板 2026 年 4 月 4 日的配置指南,在 php-fpm.conf 或 pool.d/www.conf 中找到以下两行并取消注释:slowlog = /www/wwwlogs/php_slow.log 和 request_slowlog_timeout = 5s。request_slowlog_timeout 值建议设为 2s~10s 之间,过小会导致日志爆炸式增长,过大可能漏掉真实瓶颈,生产环境首次启用推荐设为 5s。配置完成后必须重启 PHP-FPM 服务使其生效,可通过 bt 16 命令或在面板「软件商店 → PHP → 设置 → 服务」中重启。注意 PHP 7.4+ 版本默认不统计 IO 阻塞时间,多版本 PHP 需要每个版本单独配置。
验证慢日志是否生效
配置生效后需触发慢请求才能生成日志内容。根据 2026 年 3 月 15 日的测试方法,在网站根目录新建测试文件 slow_test.php,内容为,通过浏览器访问该文件 URL 后执行命令 tail -n 20 /www/wwwlogs/php_slow.log 查看日志是否新增记录。若输出中包含"script_filename"、"pid"、"time"及多层"[0x]"调用地址,则说明慢日志已成功捕获堆栈信息。也可使用命令 ps aux | grep php-fpm 查看进程是否加载了新配置路径,确认 slowlog 行是否确实已启用。
从慢日志定位问题代码
慢日志采用固定格式记录每次超时请求的完整执行路径。根据 2026 年 4 月 17 日的分析指南,每条记录末尾有类似:=> \think\App::run() /www/wwwroot/myapp/public/index.php:57,这说明耗时发生在 index.php 第 57 行调用\think\App::run() 时。重点观察调用链末尾几行,例如出现"mysqli_query"、"PDOStatement::execute"、"file_get_contents"等 I/O 操作函数,表明慢点大概率在此处。使用命令 tail -f /www/wwwlogs/php_slow.log 可实时监控日志更新,当新记录出现时查找以"[0x"开头的连续多行,这些是 PHP 内部函数调用地址,其上方紧邻的"script_filename"行即为问题脚本绝对路径。2017 年 11 月 12 日的案例显示,慢查询日志会以堆栈形式打印每个脚本执行过程中耗时较长的地方,通过分析可定位到具体插件文件的第 72 行、489 行等位置。
配合其他工具深入排查
对于间歇性高 CPU 占用问题,慢日志可能无法捕获。根据 2020 年 7 月 2 日的处理经验,可使用 strace 命令监听进程活动:strace -o /tmp/output.txt -T -tt -F -e trace=all -p 7757,然后 tail -f /tmp/output.txt 查看进程在执行什么操作。2026 年 4 月 6 日的资料指出,宝塔「监控大屏」里的「PHP 进程」只显示 php-fpm: pool www 这类通用进程名,不解析 CGI 请求路径,想实时看当前正在跑什么脚本,得用 strace 或 lsof 命令,例如 lsof -p $(pgrep -f "php-fpm: pool www" | head -1) | grep ".php"。更稳的方式是配合 htop,按 F5 进入树状视图,找 php-fpm 子进程,再按 s 查看其系统调用,常能看到 openat(, "/path/to/xxx.php")。
注意事项
根据多个来源的真实用户反馈,常见问题包括:只改了全局 php-fpm.conf 但实际生效的是 pool 级的 www.conf;日志路径写错导致日志根本没生成;/www/wwwlogs/目录属主不是 www 时 PHP 进程会静默失败,需用 ls -ld /www/wwwlogs/查归属,必要时 chown www:www /www/wwwlogs/;部分宝塔低版本在「配置修改」页改完不会同步写入 php-fpm.conf,需手动编辑该文件确认;慢日志记录完成后建议关闭,因为它可能会对性能产生一定影响,并且会随着时间的推移占用越来越多的磁盘空间;日志内容不含 POST 数据或敏感参数,但会记录完整 SCRIPT_FILENAME,这是定位函数入口的关键线索;多个嵌套 include/require 时,日志只打最外层入口文件行号,需逐层检查被引入文件。
参考来源
来源:阿里云开发者社区 - 记一次 php-fpm 进程占用 CPU100% 处理(2020 年 7 月 2 日)
来源:宝塔面板官方文档 - 如何查看宝塔面板 PHP 慢执行日志排查网站卡顿(2026 年 4 月 4 日)
来源:Hostol 技术博客 - 如何排查 PHP-FPM 进程 CPU 占用 100% 的间歇性问题(2025 年 6 月 11 日)
来源:阿里云开发者社区 - 配置 PHP-FPM 的 slowlog 记录执行过慢的 PHP 脚本日志(2024 年 9 月 20 日)