如何定位Laravel/ThinkPHP框架下PHP-FPM高CPU占用的API?
定位PHP-FPM高CPU进程对应请求的方案
1. 系统工具+PHP-FPM状态页快速定位
- 用
top或htop找出CPU占比高的php-fpm进程PID - 开启PHP-FPM状态页:编辑php-fpm配置文件(如
www.conf),设置pm.status_path = /status,并在Web服务器(Nginx/Apache)配置允许访问该路径 - 执行
curl 127.0.0.1/status?full,输出结果里找到目标PID对应的request_uri字段,直接定位到请求接口 - 进阶补充:用
strace -p <PID>跟踪进程系统调用,查看它的文件读写、网络请求等行为,辅助判断接口逻辑瓶颈
2. 配置PHP-FPM带PID的访问日志
- 编辑php-fpm的
www.conf,开启并配置访问日志:
其中access.log = /var/log/php-fpm/www-access.log access.format = "%{%Y-%m-%d %H:%M:%S}t %P %R %u %m %r"%P是进程PID,%r是完整请求URI,%m是请求方法 - 出现高CPU进程时,直接在日志文件中搜索对应PID,即可找到该进程正在处理的请求
3. 框架全局中间件埋点日志
- 在Laravel或ThinkPHP中添加全局中间件,记录当前进程PID与请求URI:
// Laravel 中间件示例 public function handle($request, Closure $next) { $pid = getmypid(); \Illuminate\Support\Facades\Log::info("PID {$pid} 处理请求: {$request->fullUrl()}"); return $next($request); }// ThinkPHP 中间件示例 public function handle($request, \Closure $next) { $pid = getmypid(); \think\Log::info("PID {$pid} 处理请求: {$request->url(true)}"); return $next($request); } - 当出现高CPU进程时,直接在框架日志中搜索PID,快速定位对应请求
4. 用phpspy实时跟踪进程代码执行
- 安装phpspy(无需编译PHP,直接下载二进制包),执行
phpspy -p <目标PID> - 工具会实时输出该进程的PHP函数调用栈,从栈信息可以直接反推对应的控制器、方法,进而定位到具体接口
内容的提问来源于stack exchange,提问作者Aroad
相关产品推荐
相关产品推荐

