phpMyAdmin 不显示 Laravel “正在运行”查询,因其仅反映 MySQL 当前 SHOW PROCESSLIST 快照;Laravel 查询执行完即释放连接,所谓“阻塞”多在应用层(如队列、中间件或外部 API 卡顿),非 MySQL 真实长查询。
为什么 phpMyAdmin 里看不到 Laravel 的“正在运行”的查询?
phpmyadmin 本身不维护连接状态快照,它只显示当前 show processlist 的结果——而 laravel 的查询一旦执行完(哪怕后续逻辑卡在 php 层、redis 或外部 api),mysql 连接早就释放了。你看到的“阻塞”,大概率是 laravel 应用层没返回响应,不是 mysql 正在跑长查询。
所以别急着在 phpMyAdmin 里点“Kill”,先确认问题真在数据库侧:
- 打开 phpMyAdmin → 左侧选中对应数据库 → 点顶部「Status」→ 查看「Processes」标签页(或直接执行
SHOW PROCESSLIST) - 重点找
State列为Sending data、Copying to tmp table、Locked或持续Query状态超过 10 秒的行 - 如果全是
Sleep,说明 MySQL 没事,问题在 Laravel 的队列、中间件、或前端请求超时重试
如何安全终止一个真实的 MySQL 阻塞查询(来自 Laravel)?
确认是真实阻塞后,必须用 KILL 命令,但不能乱杀。Laravel 默认用短连接(每次请求新建),所以查到的 ID 是瞬时的,要快准狠:
- 在 phpMyAdmin 的「Processes」页,勾选目标行左侧复选框 → 点「Kill」按钮(本质是执行
KILL <code>ID) - 或者手动执行:
KILL <code>12345(把12345换成Id列数值) - ⚠️ 别用
KILL QUERY <code>ID:它只中断当前语句,但 Laravel 可能立刻重试;KILL <code>ID才真正断开连接,强制 Laravel 报MySQL server has gone away错误并退出该请求 - 如果被杀连接属于队列 worker(如
php artisan queue:work),它会自动重启,但记得检查failed_jobs表
Laravel 自身怎么避免产生阻塞查询?
治标不如治本。Laravel 里最常触发阻塞的是没加限制的大查询、N+1、或事务卡住。关键控制点:
- 所有
DB::table(...)->get()或Model::all()必须配->limit(100),生产环境禁用无限制全表拉取 - 用
DB::enableQueryLog()+DB::getQueryLog()在本地调试,揪出慢 SQL;线上改用slow_query_log配合long_query_time = 1 - 事务里别做 HTTP 请求、文件操作、或 sleep ——
DB::transaction()块内只做 DB 操作 - 分页别用
simplePaginate以外的方案处理百万级数据;考虑游标分页(cursorPaginate)
phpMyAdmin 杀错进程后 Laravel 报错怎么办?
常见报错是 SQLSTATE[HY000]: General error: 2006 MySQL server has gone away 或 Connection refused。这不是崩溃,是预期行为:
立即学习“PHP免费学习笔记(深入)”;
- PHP-FPM 默认会重连,只要
mysql.connect_timeout和mysqli.reconnect开启(Laravel 8+ 默认开启) - 但如果是在队列里被杀,worker 可能卡住:用
php artisan queue:restart强制刷新,别直接 kill 进程 - 更隐蔽的问题是连接池耗尽:检查
max_connections是否被占满(SHOW STATUS LIKE 'Threads_connected'),必要时调高或加连接复用
真正难搞的不是杀查询,而是 Laravel 在事务里调用了一个没设超时的外部 HTTP 接口,导致 MySQL 连接挂着不动 —— 这种得去查 strace -p <code>pid,不是 phpMyAdmin 能解决的。



















