71 lines
1.7 KiB
PHP
71 lines
1.7 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* This file is part of Hyperf.
|
|
*
|
|
* @link https://www.hyperf.io
|
|
* @document https://hyperf.wiki
|
|
* @contact group@hyperf.io
|
|
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
|
|
*/
|
|
|
|
namespace App\Listener;
|
|
|
|
use Hyperf\Database\Events\QueryExecuted;
|
|
use Hyperf\Event\Annotation\Listener;
|
|
use Hyperf\Event\Contract\ListenerInterface;
|
|
use Hyperf\Logger\LoggerFactory;
|
|
use Hyperf\Utils\Arr;
|
|
use Hyperf\Utils\Str;
|
|
use Psr\Container\ContainerInterface;
|
|
use Psr\Log\LoggerInterface;
|
|
|
|
/**
|
|
* @Listener
|
|
*/
|
|
class DbQueryExecutedListener implements ListenerInterface
|
|
{
|
|
/**
|
|
* @var LoggerInterface
|
|
*/
|
|
private $logger;
|
|
|
|
public function __construct(ContainerInterface $container)
|
|
{
|
|
$this->logger = $container->get(LoggerFactory::class)->get('sql');
|
|
}
|
|
|
|
public function listen(): array
|
|
{
|
|
return [
|
|
QueryExecuted::class,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @param object|QueryExecuted $event
|
|
*/
|
|
public function process(object $event)
|
|
{
|
|
if ($event instanceof QueryExecuted) {
|
|
$sql = $event->sql;
|
|
if (!Arr::isAssoc($event->bindings)) {
|
|
foreach ($event->bindings as $key => $value) {
|
|
$sql = Str::replaceFirst('?', "'{$value}'", $sql);
|
|
}
|
|
}
|
|
|
|
if (env('SQL_QUERY_LOG', false)) {
|
|
$this->logger->info(sprintf('[%s] %s', $event->time, $sql));
|
|
return;
|
|
}
|
|
|
|
// SQL 监控,通知管理员(大于两秒)
|
|
if ($event->time >= 2000) {
|
|
$this->logger->info(sprintf('[%s] %s', $event->time, $sql));
|
|
}
|
|
}
|
|
}
|
|
}
|