PHP数据库查询性能监测工具

<?php

class QueryPerformanceMonitor {
    private $pdo;
    private $logFile;
    private $startTime;
    private $endTime;

    public function __construct($dsn, $username, $password, $logFile = 'query_performance.log') {
        try {
            $this->pdo = new PDO($dsn, $username, $password);
            $this->logFile = $logFile;
        } catch (PDOException $e) {
            die("Database connection failed: " . $e->getMessage());
        }
    }

    // 开始计时
    private function startTimer() {
        $this->startTime = microtime(true);
    }

    // 结束计时
    private function endTimer() {
        $this->endTime = microtime(true);
        return $this->endTime - $this->startTime;
    }

    // 执行查询并记录查询性能
    public function executeQueryAndLog($query, $params = []) {
        try {
            $this->startTimer(); // 开始计时
            $stmt = $this->pdo->prepare($query);
            $stmt->execute($params);
            $executionTime = $this->endTimer(); // 结束计时
            $rowCount = $stmt->rowCount(); // 获取受影响行数

            // 记录查询性能数据
            $logEntry = [
                'timestamp' => date('Y-m-d H:i:s'),
                'query' => $query,
                'execution_time' => round($executionTime, 4), // 保留4位小数
                'row_count' => $rowCount
            ];
            file_put_contents($this->logFile, json_encode($logEntry) . PHP_EOL, FILE_APPEND);

            return $stmt->fetchAll(PDO::FETCH_ASSOC); // 返回查询结果
        } catch (PDOException $e) {
            echo "Query failed: " . $e->getMessage();
            return false;
        }
    }

    // 获取日志文件中的所有查询记录
    public function getLogs() {
        if (file_exists($this->logFile)) {
            $logs = file($this->logFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
            return array_map('json_decode', $logs);
        }
        return [];
    }
}

// 示例使用
$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'root';
$password = 'password';

$monitor = new QueryPerformanceMonitor($dsn, $username, $password);

// 示例查询
$query = "SELECT * FROM users WHERE age > :age";
$params = [':age' => 25];
$result = $monitor->executeQueryAndLog($query, $params);

if ($result) {
    print_r($result);
}

// 输出所有日志
$logs = $monitor->getLogs();
foreach ($logs as $log) {
    echo "Time: {$log->timestamp}, Query: {$log->query}, Execution Time: {$log->execution_time}s, Rows Affected: {$log->row_count}\n";
}

这个PHP代码片段实现了一个数据库查询性能监测工具,适用于监控和优化数据库查询的效率。该工具的核心功能如下:

  1. 查询性能监测:通过计时来测量SQL查询的执行时间,并记录到日志中,帮助开发者了解查询的性能表现。
  2. 日志记录:每次查询后,查询的SQL语句、执行时间、受影响行数等信息会被记录在指定的日志文件(默认为query_performance.log)中,以便后续分析。
  3. 日志读取:可以通过getLogs方法读取所有已记录的查询日志,从中找到执行时间较长或需要优化的查询语句。

该工具特别适合需要对数据库性能进行监控和优化的开发场景。通过分析查询日志,开发者可以发现性能瓶颈,进而优化数据库查询和架构设计。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值