Hyperf 默认不开启 MySQL 慢查询日志,需在 MySQL 服务端配置 slow_query_log 等参数启用;Hyperf 仅可通过监听 QueryExecuted 事件在应用层记录超时 SQL。

Hyperf 默认不会开启 MySQL 慢查询日志,因为它是应用层框架,不直接控制 MySQL 服务本身的日志开关。真正要开慢查询日志,得从 MySQL 服务端配置入手;而 Hyperf 可以配合做查询耗时监控和记录(比如通过 DB 组件事件或中间件),但不是传统意义的“MySQL 慢查询日志”。
MySQL 服务端开启 slow_log
这是最标准的慢查询日志方式,记录所有超过 long_query_time 的 SQL 到文件中:
- 登录 MySQL:执行
mysql -u root -p - 临时启用(重启失效):
SET GLOBAL slow_query_log = ON;SET GLOBAL long_query_time = 1.0;SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log'; - 永久生效:编辑 MySQL 配置文件(如
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),在[mysqld]下添加:
slow_query_log = ON long_query_time = 1.0 slow_query_log_file = /var/log/mysql/mysql-slow.log log_queries_not_using_indexes = OFF # 可选:只记录没走索引的慢查
保存后重启 MySQL:sudo systemctl restart mysql(或 mysqld)
Hyperf 中监听慢查询(应用层辅助)
Hyperf 的 Db 组件支持事件监听,可在查询耗时超标时主动记录日志(不依赖 MySQL 服务日志):
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 在
config/autoload/listeners.php中注册监听器:
use Hyperf\Database\Commands\Listeners\SlowQueryListener;
return [
Hyperf\Database\Events\QueryExecuted::class => [
\App\Listener\SlowQueryListener::class,
],
];然后创建 app/Listener/SlowQueryListener.php:
namespace App\Listener;
<p>use Hyperf\Database\Events\QueryExecuted;
use Hyperf\Event\Annotation\Listener;
use Hyperf\Event\Contract\ListenerInterface;
use Psr\Log\LoggerInterface;
use Hyperf\Utils\Arr;</p><h1>[Listener]</h1><p>class SlowQueryListener implements ListenerInterface
{
public function __construct(private LoggerInterface $logger)
{
}</p><pre class="brush:php;toolbar:false;">public function listen(): array
{
return [
QueryExecuted::class,
];
}
public function process(object $event): void
{
if ($event instanceof QueryExecuted && $event->time > 1000) { // 超过 1000ms 认为慢
$sql = $event->sql;
$bindings = $event->bindings;
$time = round($event->time, 2);
$this->logger->warning('Slow SQL detected', [
'sql' => $sql,
'bindings' => $bindings,
'time_ms' => $time,
'connection' => $event->connectionName,
]);
}
}
}
验证是否生效
- MySQL 层:执行一条明显慢的 SQL(如
SELECT SLEEP(2);),再检查 slow log 文件是否有记录 - Hyperf 层:触发一个耗时长的查询(如加
sleep(1)在 SQL 前),看日志是否输出Slow SQL detected - 注意权限:确保 MySQL 日志路径可写,Hyperf 日志目录有写权限
补充说明
Hyperf 自身没有「一键开启 MySQL 慢日志」的配置项。它能做的是拦截执行事件、打点统计、上报或告警。真正的数据库级慢日志必须由 DBA 或运维在 MySQL 侧配置。两者结合使用效果更好:MySQL 日志用于 DBA 分析,Hyperf 日志用于开发快速定位业务慢接口。










