17: Trace
Phlo的跟踪模式是一个运行时插装层,它记录对生成的方法、prop getter、静态或原生函数的每次调用,包括时间和参数。每个请求Phlo会将JSON转储写入data/trace/<id>.json。此功能用于调试和性能分析,不适用于生产环境。
17.1: 什么是 trace
启用 trace 后,Phlo 的编译器会在每个生成的方法顶部注入一行代码:
trace('class->method', compact('arg1', 'arg2'))
同时,Phlo 会加载 functions.trace.php(functions.php 的生成变体),以便本地助手 esc()、arr()、loop()、view()、apply() 等所有内容也会进行 trace 调用。结果是:在请求期间发生的事情的完整时间顺序日志。
17.2: 启用
在您的开发入口点中:
phlo_app (
id: 'Example',
host: 'dev.example.nl',
build: true,
debug: true,
trace: true,
)
然后运行 build::run,以便生成的 PHP 包含 trace() 注入。从下一个请求开始,每个调用都会被记录。
跟踪输出将发送到 data/trace/。该目录会自动创建。
17.3: 一个 trace 包含了什么
每个请求一个 JSON 文件,内容如下:
| 字段 | 内容 |
|---|---|
id |
日期时间 + 随机后缀,亦为文件名 |
path, method, route |
请求上下文 |
ts, ms, count |
开始时间戳,总持续时间,事件数量 |
active |
每个文件 → 类型 → 调用计数的映射(快速概览“哪些被频繁触及”) |
sequence |
每个文件的首次触及顺序(可视化请求路径通过您的应用) |
events |
完整日志:见下文 |
每个 events 中的事件:
{
"t": 12.345,
"k": "call",
"c": "user",
"n": "byEmail",
"node": "user->byEmail",
"f": "user.phlo",
"args": {"email": "jordi@example.nl"}
}
| 字段 | 意义 |
|---|---|
t |
自请求开始以来的毫秒偏移 |
k |
类型:call, static, get(属性获取),set(属性设置),function |
c, n |
类和名称 |
f |
源文件(通过类映射 + 源映射解析) |
args |
截断的参数,见 X.4 |
17.4: 参数剪切
完整的参数值会使跟踪变得难以阅读。Phlo 剪裁:
| 类型 | 变为 |
|---|---|
null, bool, int, float |
不变 |
string > 200 个字符 |
... 截断至 200 |
array |
'[N items]'(仅长度) |
带有 id 属性的 object |
{class: ..., id: ...} |
其他 object |
{class: ...} |
这足以看到 哪些 记录被触及,而无需转储整个有效负载。
17.5: 通过 Phlo Control Center 进行阅读
Phlo 控制中心有一个 Trace 选项卡,读取 data/trace/index.json。最新的 trace 在顶部;一个选择框可以打开较旧的 trace。每个 trace 显示 active、sequence 和事件流。
index.json 保留最后 100 traces。较旧的 trace 会与它们的 JSON 文件一起自动修剪。
17.6: 维护: `build::traceShadow`
functions.trace.php 是一个生成的文件。每当您在 functions.php 中添加或更改内容时,请重新生成它:
php www/app.php build::traceShadow
这将解析 functions.php 并在每个 function foo($a, $b) 中注入以下内容,作为第一条语句:
trace('foo', compact('a', 'b'))
然后,您需要将 functions.trace.php 的内容与源文件对齐。该命令仅与正在开发 Phlo 运行时的人相关,而与应用代码无关。
17.7: 何时使用它,何时不使用它
做:
- 请求在“某处”很慢,您想知道时间花在哪里
- 探索一个不熟悉的应用程序:
sequence显示您通过代码的实际路径 - 调试竞争条件或副作用:
events显示确切的顺序 + 时间 - 用于教学:展示 Phlo 请求是如何实际展开的
不要:
- 生产环境中,每个方法调用都会产生一个日志条目和每个请求的磁盘写入
thread: true工作线程,每个请求的跟踪写入,因此,就像build一样,不安全- 性能测量精确到微秒,仪器本身会增加开销
当您需要时打开 trace: true;完成后关闭它。控制中心会持续显示历史跟踪,直到自动修剪将其清理。