响应时间高时不能直接断定是php慢还是数据库慢,关键看链路追踪中db.query与php.execute的真实耗时占比:若db.query>60%且单次>100ms,优先查sql;若php.execute占比高而db.query低,则瓶颈在纯计算、序列化等环节。

看 APM 工具里 database 和 php 环节的耗时占比
压测时接口总响应时间高,不能直接断定是 PHP 慢还是数据库慢。关键看链路追踪中各环节真实耗时分布。比如用 SkyWalking 或 Pinpoint 上报后,在「Span Detail」里找两个核心标签:db.query(数据库执行耗时)和 php.execute(PHP 代码执行耗时,不含 I/O 等待)。如果 db.query 占比超过 60%,且单次查询 >100ms,优先查 SQL;如果 php.execute 占比高但 db.query 很低,说明瓶颈在纯计算、序列化、循环或扩展调用上。
检查 MySQL 的 Slow_query_log 和 Performance_schema
数据库瓶颈常被误判为 PHP 问题,尤其当 PHP 日志没报错、但接口整体卡顿。必须验证数据库侧是否真有压力:
- 确认已开启慢日志:
SET GLOBAL slow_query_log = ON;,SET GLOBAL long_query_time = 0.1; - 查最近 5 分钟慢查询:
SELECT * FROM mysql.slow_log WHERE start_time > NOW() - INTERVAL 5 MINUTE ORDER BY query_time DESC LIMIT 10; - 对高频接口 SQL 手动
EXPLAIN,重点看type是否为ALL、key是否为NULL、rows是否远超实际匹配数 - 用
SHOW PROCESSLIST观察是否有大量Sleep或Locked状态连接,这可能是事务未提交或锁竞争
用 microtime(true) 在关键路径打点,绕过框架干扰
框架封装会掩盖真实耗时来源,尤其 Laravel/ThinkPHP 等自动注入 ORM 查询。直接在控制器入口和数据库操作前后加裸时间戳:
public function index()
{
$start = microtime(true);
// ① 这里开始算“纯 PHP 处理”:参数解析、权限校验、缓存读取
$user = Auth::user();
<pre class="brush:php;toolbar:false;">$phpBeforeDb = microtime(true) - $start;
// ② 执行 DB 查询(用原生 PDO 或 DB::raw 避免 ORM 干预)
$posts = DB::select('SELECT * FROM posts WHERE user_id = ?', [$user->id]);
$dbTime = microtime(true) - $phpBeforeDb - $start;
// ③ 后续处理:数组遍历、JSON 编码等
$response = json_encode($posts);
$total = microtime(true) - $start;
\Log::info("PHP: {$phpBeforeDb}s | DB: {$dbTime}s | Total: {$total}s");}
这样能排除中间件、事件监听器等干扰,明确看到 DB 耗时是否真的主导了响应时间。
观察 PHP-FPM 的 slowlog 和 status 页面
如果数据库指标正常,但接口仍慢,就要确认是不是 PHP 进程自身卡住:
- 开启 FPM slowlog:
request_slowlog_timeout = 1s,日志会记录卡在哪个函数(如json_encode、file_get_contents或某个扩展函数) - 访问
/fpm-status?full(需配置pm.status_path),看当前请求是否长期处于Idle或Running状态,slow_requests计数是否上升 - 对比
top中php-fpm进程的 %CPU 和 %MEM:高 CPU 通常对应算法/正则/加密类瓶颈;高 MEM 且持续增长,可能是大数组未释放或opcache.revalidate_freq=0导致频繁重编译
真正容易被忽略的是:数据库连接池耗尽时,PHP 进程会在 PDO::__construct 或 mysql_real_connect 上阻塞,此时 APM 显示为 “PHP 执行耗时高”,但实际是等待数据库连接 —— 必须结合 SHOW STATUS LIKE 'Threads_connected' 和应用层连接数配置交叉验证。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











