- 代码质量
- 静态分析
【免费下载链接】phpinsights
🔰 Instant PHP quality checks from your console
本文以仓库 README.md 为核心骨架,结合 docs/get-started.md、docs/configuration.md 与
src/下源码实现编写。PHP Insights 是一个运行在终端里的 PHP 代码质量分析工具,安装后输入一条命令即可获得代码质量、复杂度、架构与编码风格四类评分及具体问题清单。读完本文,你将掌握安装接入、Laravel 集成、配置调优、多路径分析与自动修复的完整实战能力。
一、认识 PHP Insights:一次运行,五大维度
PHP Insights(composer.json 中的描述为 "Instant PHP quality checks from your console")的设计初衷是让代码质量分析变得即时、直观且开箱即用。它聚合了php-cs-fixer、PHP_CodeSniffer(squizlabs/php_codesniffer)、slevomat/coding-standard、cmgmyr/phploc与php-parallel-lint等底层工具,对外暴露统一、友好的终端报告。
根据 README.md 的 Features 说明,其核心能力包括:
- 分析代码质量(Code Quality)与编码风格(Coding Style);
- 以漂亮的概览展示代码架构(Architecture)与复杂度(Complexity);
- 开箱即用地适配Laravel、Symfony、Yii、Magento等主流框架;
- 内置大量检查项,帮助代码保持可靠、低耦合、简单、干净。
从源码看,分析维度被拆分为 16 个 Metric 类(见 src/Domain/MetricsFinder.php),分别归属五类:
| 维度 | 代表 Metric | 关注点 |
|---|---|---|
| Code(代码) | src/Domain/Metrics/Code/ 下的Classes、Comments、Functions、Globally、Code | 类、注释、函数、全局代码的整洁度 |
| Complexity(复杂度) | src/Domain/Metrics/Complexity/Complexity.php | 圈复杂度、方法平均复杂度等 |
| Architecture(架构) | src/Domain/Metrics/Architecture/ 下的 8 个 Metric | 命名空间、接口、Trait、全局元素等结构性问题 |
| Style(风格) | src/Domain/Metrics/Style/Style.php | PSR 编码风格与格式规范 |
| Security(安全) | src/Domain/Metrics/Security/Security.php | 依赖与代码中的安全隐患 |
二、环境要求与安装
PHP Insights 对运行环境的要求(依据 composer.json 的require段):
- PHP 版本:
^8.4(即 PHP 8.4 及以上); - PHP 扩展:
ext-iconv、ext-json、ext-mbstring、ext-tokenizer; - 若使用
checkstyle输出格式,建议安装ext-simplexml(见suggest段)。
安装方式与普通 Composer 开发依赖一致(来自 README.md):
composer require nunomaduro/phpinsights --dev装完后即可运行:
# Mac & Linux ./vendor/bin/phpinsights # Windows .\vendor\bin\phpinsights.bat首次运行会基于当前工作目录自动收集*.php文件(默认排除vendor、tests等目录,见 src/Infrastructure/Repositories/LocalFilesRepository.php 的DEFAULT_EXCLUDE),随后展示评分与问题明细。
三、Laravel 项目集成
针对 Laravel 项目,PHP Insights 提供了专属的 Artisan 集成(README.md 的 Quick start 部分)。
第一步:发布配置文件
php artisan vendor:publish --provider="NunoMaduro\PhpInsights\Application\Adapters\Laravel\InsightsServiceProvider"该命令由 src/Application/Adapters/Laravel/InsightsServiceProvider.php 定义,它会把 stubs/laravel.php 复制为config/insights.php,并注册insights命令。
第二步:运行分析
php artisan insightsArtisan 命令insights定义在 src/Application/Adapters/Laravel/Commands/InsightsCommand.php,其行为与独立二进制一致,并且会读取config/insights.php作为配置(配置路径默认为config/insights.php)。若尚未发布配置,命令会提示先执行php artisan vendor:publish。
四、命令行选项与退出码
独立二进制与php artisan insights都支持同一套命令行参数。参数定义见 src/Application/Console/Definitions/AnalyseDefinition.php 与 src/Application/Console/Definitions/BaseDefinition.php:
| 参数/选项 | 说明 | 默认值 |
|---|---|---|
paths(位置参数) | 要分析的目录或文件路径,可传多个 | 当前工作目录 |
-c, --config-path | 指定配置文件路径 | 自动查找phpinsights.php |
-s, --summary | 仅显示评分摘要 | 关闭 |
--min-quality | 代码质量最低分,低于则返回错误码 | 0 |
--min-complexity | 复杂度最低分 | 0 |
--min-architecture | 架构最低分 | 0 |
--min-style | 风格最低分 | 0 |
--disable-security-check | 发现安全问题时不再视为错误 | 关闭 |
--format | 输出格式,可多选:console、json、checkstyle、codeclimate、github-action | console |
--composer | 指定 composer.json 路径 | 自动查找 |
--fix | 对可修复的 Insight 自动修复 | 关闭 |
--flush-cache | 分析前清空缓存结果 | 关闭 |
退出码语义(见 src/Application/Console/Commands/AnalyseCommand.php):命令结束时返回0表示通过;若任一评分低于对应min-*阈值,或发现安全问题时disable-security-check未开启,则返回1并输出类似The code quality score is too low的错误提示。这一机制可直接用于 CI 门禁。
五、配置详解:phpinsights.php
默认情况下 PHP Insights 无需任何配置即可运行。需要定制时,可复制官方模板到项目根目录(参考 docs/configuration.md):
cp vendor/nunomaduro/phpinsights/stubs/config.php phpinsights.php各框架也提供了对应的模板:stubs/laravel.php、stubs/symfony.php、stubs/magento2.php、stubs/drupal.php、stubs/wordpress.php。
完整配置模板(stubs/config.php)包含以下区块:
5.1 preset:预设
'preset' => 'default',支持的取值:default、laravel、symfony、magento2、drupal、wordpress。若不显式指定,PHP Insights 会读取项目composer.json自动猜测(见下文第六节)。
5.2 ide:终端文件超链接
'ide' => null,开启后,报告中涉及的文件会变成可点击的超链接,点击即可在指定 IDE 中打开对应行。内置支持:textmate、macvim、emacs、sublime、phpstorm、atom、vscode(映射表见 src/Domain/Configuration.php 的LINKS常量)。也可自定义 URL 协议,例如:
'ide' => 'myide://open?url=file://%f&line=%l',5.3 exclude / add / remove / config:定制检查项
'exclude' => [ // 'path/to/directory-or-file' ], 'add' => [ // ExampleMetric::class => [ // ExampleInsight::class, // ] ], 'remove' => [ // ExampleInsight::class, ], 'config' => [ // ExampleInsight::class => [ // 'key' => 'value', // ], ],exclude:排除目录或文件,不参与分析;add:按 Metric 追加自定义 Insight 检查;remove:移除不需要的 Insight(包括各预设默认启用的项);config:为指定 Insight 覆盖参数。
以上键均经过严格校验:add中的 Metric 必须实现Metric接口、Insight 类必须存在;config的键必须是存在的类,否则抛出InvalidConfiguration(见 src/Domain/Configuration.php 的validateAddedInsight()/validateConfigInsights())。添加的规则与预设移除的规则冲突时,用户配置优先(见 src/Application/ConfigResolver.php 的preparePreset())。
5.4 requirements:CI 门槛
'requirements' => [ // 'min-quality' => 0, // 'min-complexity' => 0, // 'min-architecture' => 0, // 'min-style' => 0, // 'disable-security-check' => false, ],与命令行同名选项一一对应,且命令行传入值会覆盖配置文件(ConfigResolver::mergeInputRequirements())。合法的键集合定义在 src/Domain/Configuration.php 的ACCEPTED_REQUIREMENTS,写入未知键会直接报错。
5.5 threads / timeout:并发与超时
'threads' => null, 'timeout' => 60,threads:分析使用的并发线程数,接受null或大于 0 的整数;为null时自动探测 CPU 核数(Linux 读/proc/cpuinfo,macOS 用sysctl -n hw.ncpu,Windows 用wmic,实现见 src/Domain/Configuration.php 的getNumberOfCore());timeout:单次分析进程的超时秒数(>0),默认 60 秒,超时抛出ProcessTimedOutException。
另外配置文件还支持diff_context键(默认1,需 >= 0),用于控制问题详情中 diff 展示的上下文行数:
// 来自 docs/get-started.md 'diff_context' => 3,六、预设机制:自动识别你的框架
PHP Insights 的核心易用性来自"预设自动猜测"(详见 src/Application/ConfigResolver.php 的guess()):读取项目composer.json的依赖,按顺序匹配各框架预设的shouldBeApplied()条件:
- Laravel:依赖含
laravel/framework或illuminate/*(src/Application/Adapters/Laravel/Preset.php); - Symfony、Yii、Magento2、Drupal、WordPress:各自的 src/Application/Adapters/ 下 Preset 实现判定;
- 都匹配不上则回退到
default预设(src/Application/DefaultPreset.php)。
各预设会定制自己的检查规则。以 Laravel 预设为例,它:
- 默认排除
config、storage、resources、bootstrap、nova、database、public等目录,以及server.php、_ide_helper.php、TelescopeServiceProvider.php等文件; - 将
dd、dump、ddd、tinker列为禁用函数; - 放宽
set*Attribute形式的 setter 方法检查; - 移除
ProtectedToPrivateFixer、VoidReturnFixer、StaticClosureSniff等与 Laravel 习惯冲突的规则。
默认预设则统一排除bower_components、node_modules、vendor、vendor-bin、.phpstorm.meta.php,并为DeclareStrictTypesSniff、PropertyTypeHintSniff等配置了具体参数(见 src/Application/DefaultPreset.php)。
七、精确控制分析范围:目录、文件与多路径
除了默认分析整个项目,PHP Insights 支持非常灵活的范围控制(来自 docs/get-started.md):
# 分析某个目录 ./vendor/bin/phpinsights analyse path/to/analyse # 分析某个文件 ./vendor/bin/phpinsights analyse path/to/analyse.php # 同时分析多个目录 ./vendor/bin/phpinsights analyse path/to/dir1 path/to/dir2 # 同时分析多个文件 ./vendor/bin/phpinsights analyse path/to/file1.php path/to/file2.php # 目录与文件混用 ./vendor/bin/phpinsights analyse path/to/dir path/to/file.phpLaravel 中同样支持传路径:
php artisan insights path/to/analyse php artisan insights path/to/dir path/to/file.php路径在 src/Application/PathResolver.php 中被解析为绝对路径;文件收集逻辑(src/Infrastructure/Repositories/LocalFilesRepository.php)只收录*.php文件、跳过*.blade.php,并默认排除vendor、tests、test等目录。
若需要指定非标准位置的 composer.json,可加--composer参数:
./vendor/bin/phpinsights analyse --composer=/var/www/composer.json八、自动修复问题代码
部分 Insight 支持一键自动修复(docs/get-started.md 的 "Fixing errors automatically" 一节)。两种触发方式:
# 方式一:分析的同时修复 vendor/bin/phpinsights analyse path/to/analyse --fix # Laravel 中的等价命令 php artisan insights path/to/analyse --fix # 方式二:只执行修复 vendor/bin/phpinsights fix path/to/analyse--fix走的是 src/Application/Console/Commands/AnalyseCommand.php 的修复分支,输出会附带所有已修复问题的汇总;fix子命令则由 src/Application/Console/Commands/FixCommand.php 实现。修复能力基于 PHP-CS-Fixer 与 PHP_CodeSniffer 的 fixer 机制(对应 src/Domain/FileProcessors/FixerFileProcessor.php 与 src/Domain/FileProcessors/SniffFileProcessor.php),仓库的 tests/Feature/Fix/ 目录保留了ParamTypeHint、UnorderedUse等修复前后的对照夹具。
九、输出格式:console / json / checkstyle / codeclimate / github-action
通过--format可切换输出格式(格式注册表见 src/Application/Console/Formatters/FormatResolver.php):
./vendor/bin/phpinsights analyse --format=jsonconsole:默认的彩色终端报告;json:结构化 JSON,便于程序解析。其summary字段包含code、complexity、architecture、style、security issues、fixed issues六个键(见 src/Application/Console/Formatters/Json.php);checkstyle:Checkstyle XML 格式,可与 SonarQube 等工具对接(需要ext-simplexml);codeclimate:Code Climate 兼容格式;github-action:GitHub Actions 专用格式,自动转义换行并输出::error工作流命令(见 src/Application/Console/Formatters/GithubAction.php)。
多格式还可同时输出(--format支持数组),或配合-s/--summary只输出评分摘要。仓库的 docs/continuous-integration.md、docs/github-action.png 与 docs/gitlab-code-quality.png 展示了 CI 接入场景。
将结果保存到文件(docs/get-started.md):
./vendor/bin/phpinsights analyse --format=json > test.json重定向时建议加上-n(--no-interaction)避免交互提示被写入管道;若希望进度条原地刷新而非逐行打印,可加--ansi。
十、一次分析是如何发生的:源码级运行原理
理解底层流程有助于排查问题与评估开销。一次phpinsights analyse的主链路如下(对应 src/Domain/Runner.php 与 src/Domain/Insights/InsightCollectionFactory.php):
- 收集文件:
FilesRepository基于 Symfony Finder 按路径与排除规则收集 PHP 文件; - 跳过缓存:未开启
--fix时,若文件内容哈希命中缓存(insights.<configHash>.<fileMd5>),直接复用上次结果; - 多线程分片:按
threads将文件列表切成多份,分别以php bin/phpinsights internal:processors <cacheKey>子进程并行执行(src/Application/Console/Commands/InternalProcessorCommand.php); - 子进程处理:每个文件先经
php -l语法校验,再交给各FileProcessor(Sniffer / Fixer)运行对应 Insight;结果写入缓存; - 汇总评分:主进程读取缓存,
Results(src/Domain/Results.php)按类别统计"未出问题的 Insight 比例"折算成百分制分数,复杂度维度则按"出问题文件数 / 总文件数"反推; - 输出报告:
Formatter(Console / Json 等)渲染结果,最后由AnalyseCommand对照min-*阈值决定退出码。
因此,threads与timeout直接影响分析速度与稳定性,而--flush-cache可强制全量重跑(docs/get-started.md 也提示:缓存会在检测到代码变化时自动失效,无需手动清理)。
十一、常见问题与实用技巧
11.1 内存不足(Allowed memory size ... exhausted)
分析大项目时可能遇到Allowed memory size of XXXXX bytes exhausted,临时提高内存限制即可(docs/get-started.md):
php -d memory_limit=2000M ./vendor/bin/phpinsights11.2 只看全部问题详情
终端默认每个 Insight 只展示前 3 条问题,加-v(verbose)可展开全部明细:
./vendor/bin/phpinsights -v11.3 用 Docker 运行
不想污染本地依赖时,可直接用官方镜像(docs/get-started.md):
docker run -it --rm -v "$(pwd):/app" nunomaduro/phpinsights仓库的 docker/Dockerfile 提供了镜像构建定义。
11.4 规避 Composer 依赖冲突
若phpinsights与其他依赖存在版本冲突,推荐用 bamarni/composer-bin-plugin 隔离安装:
composer require --dev bamarni/composer-bin-plugin composer bin phpinsights require nunomaduro/phpinsights ./vendor/bin/phpinsights11.5 在 CI 中作为质量门禁
将analyse命令与--min-*阈值结合,即可在 GitHub Actions、GitLab CI 等流水线中强制质量达标:分数不足时命令以非零码退出,流水线自动失败。仓库自身的 composer.jsonscripts段就定义了一套phpstan:test、csfixer:test、phpunit:test、insights串联的质量检查流程,可作为项目接入范本。
十二、小结
从 README.md 的 Quick start 出发,PHP Insights 真正做到了"一条命令即出报告":Composer 安装后即可分析,Laravel 项目只需一次vendor:publish;想要更精细的控制,则通过phpinsights.php配置preset、exclude/add/remove/config、requirements、threads与timeout;配合--fix自动修复、--format多格式输出与min-*退出码机制,它既是一个本地开发自查工具,也是一套开箱即用的 CI 质量门禁。项目遵循 MIT 协议(LICENSE.md),更多扩展阅读可参考仓库内的 docs/get-started.md、docs/configuration.md、docs/continuous-integration.md 与 docs/ide.md。
- 代码质量
- 静态分析
【免费下载链接】phpinsights
🔰 Instant PHP quality checks from your console
相关推荐
PHP Insights 入门指南:5分钟快速掌握终端代码质量检查
PHP Insights 入门指南:5分钟快速掌握终端代码质量检查 PHP Insights 是一款强大的终端代码质量检查工具,能够在控制台中快速分析PHP项目
代码质量静态分析痞子衡嵌入式半月刊内容结构全解析:如何高效阅读资讯/项目/工具/RT出品四大栏目
痞子衡嵌入式半月刊内容结构全解析:如何高效阅读资讯/项目/工具/RT出品四大栏目 痞子衡嵌入式半月刊(pzh mcu bi weekly)是一个持续更新的嵌入式
文档技术博客嵌入式教程从jq迁移到query-json完全指南:10大破坏性变更与应对清单
从jq迁移到query json完全指南:10大破坏性变更与应对清单 query json 是用 OCaml 编写的快速 JSON 查询语言,也是 jq 的高性
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考