news 2026/11/2 1:58:55

从千行到6行:PAO压缩PHP测试输出的震撼前后对比

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从千行到6行:PAO压缩PHP测试输出的震撼前后对比

【免费下载链接】pao

PAO is agent-optimized output for PHP testing tools.

项目地址:https://gitcode.com/gh_mirrors/pao1/pao
点击查看免费下载

当你用 AI Agent 跑 PHP 测试时,满屏的进度点和冗长日志不仅白白消耗 Token,还会干扰 AI 的判断。PAO 是专为 AI Agent 优化的 PHP 测试输出工具:安装后零配置,自动把 PHPUnit、Pest 等上千行冗长输出压缩成 6 行结构化 JSON,Token 消耗最高直降 99.8%。

什么是 PAO?AI Agent 跑 PHP 测试的 Token 救星

PAO 的核心思想只有一句话:人看的输出给 AI 用,是浪费。

它会先检测当前工具是否运行在 AI Agent 环境中(如 Claude Code、Cursor、Devin、Gemini CLI 等),如果是,就把冗长的、为人类设计的彩色终端输出,替换成超紧凑的结构化 JSON。检测逻辑在入口文件 src/Autoload.php 中,几行代码就完成了判断与开关控制。

三个关键特性:

  • 🚀零配置:通过 Composer 自动加载器自动挂钩,装完即用
  • 🎭只影响 AI,不影响人:你或团队在终端里直接跑测试时,输出与原来完全一致——同样的颜色、同样的格式
  • 📦全生态覆盖:PHPUnit 12-13、Pest 4-5、Paratest、PHPStan、Rector,以及 Laravel 12+ 的 Artisan 命令

震撼前后对比:1000 个测试从千行变 6 行

来看一次真实的前后对比。一个包含1002 个测试的测试套件,未安装 PAO 时的 PHPUnit 输出是这样的:

PHPUnit 12.5.14 by Sebastian Bergmann and contributors. ............................................................. 61 / 1002 ( 6%) ............................................................. 122 / 1002 ( 12%) .......................... 1002 / 1002 (100%) Time: 00:00.321, Memory: 46.50 MB OK (1002 tests, 1002 assertions)

安装 PAO 后,AI Agent 拿到的变成了这段 JSON:

{ "tool": "phpunit", "result": "passed", "tests": 1002, "passed": 1002, "duration_ms": 321 }

📉 数据不会说谎:

指标效果
Token 消耗最高减少99.8%
输出体积恒定大小,与测试数量无关
Artisan 命令输出最多减少75%(如 2,111 字符 → 535 字符)

测试失败时,JSON 里会带上文件路径、行号和失败信息,AI 可以直接定位问题,而不必从几千行日志里大海捞针。Pest 插件(如--coverage、--profile)产生的额外输出也会被清理掉 ANSI 转义码和装饰字符后,收纳进 JSON 的raw字段,信息一点不丢。

PAO 快速上手:一条命令完成零配置安装

要求 PHP 8.3+,其余什么都不用管:

composer require laravel/pao --dev

就这样。PAO 通过 Composer 的自动加载机制自动挂钩 PHPUnit、Pest、Paratest、PHPStan 和 Rector;在 Laravel 项目中,src/Laravel/ServiceProvider.php 会被自动发现,顺手清理 Artisan 命令输出。

还有两个环境变量可以控制行为:

  • PAO_DISABLE=true:手动关闭 PAO
  • PAO_FORCE=true:强制启用,无需 Agent 检测

工具与驱动的路由分发逻辑见 src/Execution.php,按可执行文件名自动匹配对应的 Starter。

支持哪些工具?PHPUnit、Pest、PHPStan 全家族

每个工具都有独立的驱动,按统一接口 src/Contracts/Driver.php 实现start/name/parse三个方法:

工具驱动入口说明
PHPUnitsrc/Drivers/Phpunit/Starter.php自动附加--no-output,只解析结果
Pestsrc/Drivers/Pest/Plugin.php以 Pest 插件形式接入
PHPStansrc/Drivers/Phpstan/Starter.php输出转为带行号、错误标识的结构化 JSON
Rectorsrc/Drivers/Rector/Starter.php自动切换到原生 JSON 输出格式

对 Rector 这类本来就有 JSON 模式的工具,PAO 直接让它输出file_diffs、changed_files等结构化数据,AI 一眼就能看懂改了哪些文件、应用了哪些规则。

🔍 Laravel Artisan 输出瘦身

在 Laravel 项目中,Artisan 命令输出会自动剥离 ANSI 颜色、制表框线和冗余空白:

# Before(无 PAO)— 2,111 字符 Application Name ................................................... Laravel # After(有 PAO)— 535 字符 Application Name .. Laravel

about、db:show、migrate:status这类命令,信息一样,只是没了"包装纸"。

🐳 Docker 环境下启用 PAO 的方法

PAO 靠环境变量识别 Agent,容器内跑测试时需要把AI_AGENT、CLAUDECODE、CURSOR_AGENT等变量转发进容器,或者在命令上直接设置PAO_FORCE=true,即可跳过检测强制激活。

PAO 源码结构速览

想深入了解实现原理?几个值得看的位置:

  • src/Autoload.php:进程退出时的钩子,完成输出捕获、清洗与 JSON 序列化
  • src/OutputCleaner.php:负责剥离 ANSI 颜色码与装饰字符
  • src/Drivers/Concerns/TestResultParsable.php:测试结果解析的公共逻辑
  • composer.json:自动加载入口与 Laravel 服务提供者注册

总结

PAO 解决了一个 AI 辅助开发时代的新痛点:PHP 测试工具的"人类友好"输出,对 AI 来说就是 Token 黑洞。

它用零配置的方式,在 AI Agent 环境中把 PHPUnit 千行进度点压缩成 6 行 JSON、把 Artisan 输出瘦身 75%,而在人类终端里保持原样不动——对现有工作流零影响。如果你的 PHP 项目正在与 Claude Code、Cursor 等 Agent 协作,composer require laravel/pao --dev这一条命令,就是你的第一站。

【免费下载链接】pao

PAO is agent-optimized output for PHP testing tools.

项目地址:https://gitcode.com/gh_mirrors/pao1/pao
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/2 1:58:18

九.数据结构——哈希表(2)

哈希表(1)中我们简单的认识了一下哈希表的相关内容,本章,让我们一起完成哈希表的构建和相关操作的代码实现吧!代码:0.结构体的定义(hash表和hash桶节点)//hash表的默认负载因子 #def…

作者头像 李华
网站建设 2026/11/2 1:56:52

Vim 学习速成:理解快捷键

Vim 学习速成 一、Vim 的优势 Vim 通过全键盘快捷键完成操作,长期使用效率高于依赖鼠标的编辑器(VS Code、Sublime Text 等)。类比竞技游戏:高阶操作绑定快捷键,规避鼠标移动带来的延迟;Vim 不需要做到全…

作者头像 李华
网站建设 2026/11/2 1:56:20

00 专栏导读:MES选型先看业务范式,而不是看功能清单

专栏:制造业各行业MES业务流程、底层逻辑与系统适配性 读者:MES实施顾问、CIM/EAP工程师、工艺工程师、生产负责人 属性:B线技术深度稿。主站先发,CSDN T+24h 同步。 一、开篇:选型失败,多半不是功能不够 先说一个很常见的场面。 一家做注塑的厂要上 MES,选型会上摆了…

作者头像 李华
网站建设 2026/11/2 1:56:01

【Python】主进程_子进程

可以通过代码查看任务管理器查看:在windows系统中,查看:进程名,父进程pid,进程pid的命令如下 wmic process get Name,ParentProcessId,ProcessId

作者头像 李华
网站建设 2026/11/2 1:54:58

Transformer架构:从原理、架构到大模型落地

2017年,Google 在论文《Attention Is All You Need》中提出的 Transformer 架构,彻底颠覆了深度学习序列建模的技术体系。在此之前,NLP、语音、时序预测等任务长期依赖 RNN、LSTM、GRU 等循环结构,受限于串行计算逻辑,…

作者头像 李华
网站建设 2026/11/2 1:54:55

销售线索拨打时机对接通率影响的几个实用技巧总结

销售线索拿到手之后,拨打的时间节点对接通率有明显影响,下面做个方法总结。当天打和隔天打,接通率真的有差别吗?差别主要看线索的来源。如果是客户主动留资、官网咨询或者刚报名参加过活动,这类线索对来电是有预期的&a…

作者头像 李华