b2pweb/bdf-prime-analyzer

分析Prime ORM生成的查询,并输出不安全或未优化的查询

v1.0.3 2024-02-27 08:31 UTC

This package is auto-updated.

Last update: 2024-09-27 16:22:44 UTC


README

build codecov Packagist Version Total Downloads Type Coverage

分析运行时执行的查询,报告可疑查询或优化提示。

用法

使用composer安装

composer require --dev b2p/bdf-prime-analyzer

在单元测试用例中注册

    public static function createApplication()
    {
        $app = require __DIR__ . '/../../app/application.php';
        // ...
        $app->register(new \Bdf\Prime\Analyzer\PrimeAnalyzerServiceProvider([
            'ignoredPath' => [dirname(__DIR__)],
            'dumpFormats' => [
                new \Bdf\Prime\Analyzer\Testing\DumpFormat\HtmlDumpFormat(__DIR__.'/prime-report.html'),
                new \Bdf\Prime\Analyzer\Testing\DumpFormat\ConsoleDumpFormat(),
            ],
            'ignoredAnalysis' => [],
        ]));
        
        // ...

        return $app;
    }

要忽略单个查询的分析,在执行行简单添加 @prime-analyzer-ignore [analisys] 标签。

$credentials = $device->relation('credentials')->first(); // @prime-analyzer-ignore optimisation sort

您也可以在全局上忽略实体的分析,使用Mapper类的docblock。与查询内联忽略不同,参数可以设置为仅忽略列出的属性。

/**
 * Mapper for TourOperation
 *
 * @prime-analyzer-ignore sort position
 * @prime-analyzer-ignore not_declared my_raw_attribute
 * @prime-analyzer-ignore index
 */
class TourOperationMapper extends Mapper
{
    // ...
}

选项

在服务提供商注册上可设置的可用选项

  • ignoredPath : 忽略查询分析中的路径列表。例如,测试目录。
  • ignoredAnalysis : 忽略的分析列表。见AnalysisTypes。可以使用AnalysisTypes::optimisations()仅报告危险查询。
  • dumpFormats : DumpFormatInterface实例列表。
    • ConsoleDumpFormat : 测试结束后在控制台进行转储
    • HtmlDumpFormat : 转储到HTML文件
  • register : 设置为false以禁用报告

分析

  • like : 分析LIKE过滤器,并转储没有通配符_或%的值。
  • index : 转储没有索引的查询。至少有一个关系或连接的查询被忽略。
  • not_declared : 转储未声明的属性的使用(即不在mapper中的属性)。
  • sort : 转储具有非索引属性上的ORDER子句的查询。如果返回集很小,可以忽略这些报告。
  • or : 转储没有嵌套在括号中的OR子句的查询。
  • optimisation : 转储可以使用KeyValueQuery或findById进行优化的查询。有关更多信息,请参阅限制。
  • relation_distant_key : 转储使用关系的远程键而不是本地键的查询。这会导致无用的连接。不要处理"通过"关系。
  • write : 转储无效的更新或插入查询。分析未声明的属性和值类型。
  • n+1 : 转储N+1或循环查询。要引发N+1,查询必须至少调用两次,并且具有相同的堆栈跟踪。仅在循环是所需的情况下忽略(如walker)。

限制

  • 不处理原始表达式或连接。
  • optimisation 可能会在关系查询上生成报告,这无法修复,应忽略。
  • n+1 在同一实体上加载两个关系(例如,$orderCustomer.load(['lading', 'delivery']))的情况下可能报告假阳性。
  • 始终验证索引。索引分析不代替 EXPLAIN