10: 工具和 CLI
Phlo 应用程序具有用于 build、lint、release 和 reflection 的 CLI 层。始终通过应用程序的开发入口点使用它。
10.1: 构建命令
php www/app.php build::run
php www/app.php build::lint
php www/app.php build::release
php www/app.php build::config
php www/app.php build::changed
build::lint 应该返回一个空数组:
[]
如果 lint 报告错误,请修复 .phlo 源文件并重新构建。切勿修补生成的 PHP。
10.2: 反射命令
反射帮助您在更改应用程序之前理解它:
php www/app.php reflect::context
php www/app.php reflect::compactRoutes
php www/app.php reflect::compactViews
php www/app.php reflect::resourceSummary
php www/app.php reflect::objectIndex
php www/app.php reflect::functionIndex
这些命令返回 JSON,并且旨在用于 build: true 的开发环境。
相同的自省驱动了 Phlo 控制中心的图形视图:您应用程序的每个类、资源和依赖边,从 reflect::graph 实时呈现:

10.3: 通用 CLI 调度
build:: 和 reflect:: 只是一个更通用机制的两个示例。Phlo 的 CLI 可以调用您应用中的 任何 static、method 或 function:
php www/app.php tasks::run # 类上的 static 方法
php www/app.php app.heartbeat # Phlo 实例上的方法
php www/app.php answer "is an eel a fish" # 全局函数
三种模式:
| 模式 | 调度 | 示例 |
|---|---|---|
Class::method args |
类上的 static 方法 | tasks::run,backup::nightly |
object.method args |
通过 phlo(object) 的实例方法 |
app.heartbeat,cms.reindex |
function args |
全局函数 | answer "question" |
输出以 JSON 格式发送到 stdout,错误信息以非零退出代码发送到 stderr。这使得您应用中的每个例程都可以直接从 cron、部署脚本、监控或终端中使用,而无需为此构建单独的 CLI 层。
仅在 www/app.php 中设置 build: true 时可用。请勿在实时生产环境中运行。
10.4: 调试助手
在 phlo_app(...) 中设置 debug: true,Phlo 激活一组用于开发期间检查的助手。在生产环境中,它们是无效的。
| 助手 | 目的 | 行为 |
|---|---|---|
d(...$args) |
将值转储到响应中,继续运行 | 收集在 %res->dump 中;在请求结束时渲染到浏览器控制台。在没有 debug: true 的情况下无效 |
dx(...$args) |
转储 + 停止 | 同步:完整的调试页面,带有源映射的 .phlo 文件和行号。异步/CLI/流式:转储通过 apply 负载到达浏览器控制台。安全的 Worker:抛出异常而不是调用 die() |
debug($msg) |
将一行附加到调试日志;没有参数的 debug() 返回所有收集到的内容 |
记录到浏览器控制台,带有请求统计信息 |
error($msg, $code = 500) |
Phlo 异常处理程序的运行时错误 | 抛出 PhloException,记录在 data/errors.json 中 |
trace($node, $args) |
手动跟踪事件(仅在 trace: true 时激活) |
向跟踪日志添加事件,参见 Trace 章节 |
生命周期:助手在请求期间收集(%res->dump,%res->debug);在同步页面结束时,内联脚本将所有内容与内存、持续时间和跟踪元数据一起记录到浏览器控制台,异步响应在其 apply 负载中携带相同的数据。对象通过 objInfo() 解包。运行时错误累积在 data/errors.json 中(消息、源映射文件和行号、计数、最后一次发生);可以通过 reflect::errors 或在 Phlo Control Center 中读取它们。
method buildReport {
$data = $this->load
debug('loaded', count: count($data))
if (!$data) error('No data to report')
dx($data[0])
}
dx() 是您在开发期间的主要“停止并查看那里有什么”的工具。忘记在发布代码中添加 dx()?在 debug: false 模式下,它的行为就像 error(),没有静默传递。
10.5: 工作流程
在开发环境中,Phlo Control Center(位于 /phlo)将整个循环放入浏览器中:源代码、构建、发布和错误,每个文件只需点击一下即可访问:

- 首先阅读源代码和反射输出。
- 仅修改
.phlo、data/app.json或入口点。 - 运行
build::run。 - 运行
build::lint。 - 测试相关的 HTTP routes。
- 当阶段/发布输出需要更新时,运行
build::release。
10.6: 开发、阶段和生产
开发通常具有:
auth: true,
build: true,
debug: true,
在 build+debug 模式下,内置控制 UI 默认位于 /phlo;使用 control: 'path' 在 phlo_app(...) 中选择不同的路径。阶段/生产通常在没有 build 和没有 debug 的情况下运行。webroot 指向 release/www/。
10.7: HEAD 和 async
当前运行时支持正常的 HTTP 方法,包括 HEAD。异步请求由前端资源处理,并使用与同步请求相同的 routes,除非您明确声明其他 route。