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 实时呈现:

控制中心图形视图:您应用程序的类、资源和依赖边,从 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::runbackup::nightly
object.method args 通过 phlo(object) 的实例方法 app.heartbeatcms.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 Control Center 源视图:每个 .phlo 文件高亮并可搜索,距离构建、发布和错误仅一步之遥

  1. 首先阅读源代码和反射输出。
  2. 仅修改 .phlodata/app.json 或入口点。
  3. 运行 build::run
  4. 运行 build::lint
  5. 测试相关的 HTTP routes。
  6. 当阶段/发布输出需要更新时,运行 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。

我们使用必要的cookie来使该网站正常工作。在您的许可下,我们还使用分析工具来改善网站。