乐于分享
好东西不私藏

Langfuse 集成源码:batch 协议、media 上传与 mock 测试(第89篇-E75)

Langfuse 集成源码:batch 协议、media 上传与 mock 测试(第89篇-E75)

上一篇站在使用者视角把行车记录仪装上了:handler 翻译切面、队列攒批、四道工序。这篇下到桥接层最底下——libs/acl/langfuse 这个不含任何 Eino 概念的纯 HTTP 客户端库,回答三个出门前才需要想的问题:

  1. 一批事件出门时,线上到底跑的是什么协议?(batch ingestion)
  2. 用户发了张 base64 图片,怎么不把管道撑爆?(media 三步上传)
  3. 这套东西不发真请求怎么测?(两层 mock)

(一)batch ingestion:一个 POST 的三级响应

协议本身简单到一句话:POST {host}/api/public/ingestion,Basic 认证(pk:sk base64),body 是 {"batch": [事件数组], "metadata": {批次信息}}。值得看的是两边的设计。

事件信封是"类型字段 + 联合体"。 每个事件固定五件套 {id, type, timestamp, metadata, body}type 是上一篇讲过的八种(trace-create / span-create / …),body 是五选一的联合体:

type eventBodyUnion struct {	Trace      *TraceEventBody      `json:",inline,omitempty"`	Span       *SpanEventBody       `json:",inline,omitempty"`	Generation *GenerationEventBody `json:",inline,omitempty"`	Event      *EventEventBody      `json:",inline,omitempty"`	Log        *SDKLogEventBody     `json:",inline,omitempty"`}

Go 没有原生 union,这里的做法是五个指针字段 + 手写 MarshalJSON 按优先级序列化非空的那个(event.go:85-96)。事件类型在信封上、字段形状在 body 里——这也是 Langfuse 服务端能按 ID upsert 的前提:span-create 和 span-update 带同一个 observation ID,谁先到都能落库。

响应分三级处理client.go:134-150):

状态码
含义
客户端行为
200 / 201
全部成功
直接返回 nil
207 Multi-Status
部分
成功
解析 errors 数组,聚合成 apiErrors 返回
其他
全部失败
包成 *apiError{Status, 原始body} 返回

207 是批量接口特有的语义:一批 15 条事件,14 条落库 1 条被拒(比如单字段超限),服务端不会整体回滚,而是告诉你哪条死了。合理,但和上一篇的重试分类碰在一起有个细节:重试判定用 errors.As(err, &apiError) 匹配 *apiError,而 207 聚合出来的是 apiErrors(切片类型)——类型不匹配,不会被判成永久失败,于是整批走重试。重试会把已成功的 14 条再发一遍。好在 ingestion 按 ID upsert,幂等兜住了,代价只是白传。这是个"两个各自合理的设计拼在一起产生冗余"的典型样本。

一个逐字段核对才会发现的坑:批次 metadata 的组装(consumer.go:284-290)里,SDK 标识三个字段的值交叉了:

"sdk_integration": i.sdkIntegration, // "eino"   ✓"sdk_name":        i.sdkVersion,     // "v0.0.1" ✗ 应为 "Golang""sdk_version":     i.sdkIntegration, // "eino"   ✗ 应为 "v0.0.1"

对照常量定义(langfuse.go:27-29sdkName="Golang"sdkIntegration="eino"sdkVersion="v0.0.1"),sdk_name 填进了 version 的值、sdk_version 填进了 integration 的值。只影响 Langfuse 界面上 SDK 标识的展示,不影响数据,属于 LOW 级别缺陷——但它是真实存在的,demo 场景 A 把实际出门的 metadata 打了出来:

====== 场景 A:ingestion 响应三级分类 + 出门 metadata ======  批 1 → 200 OK           :成功,无错误  批 2 → 207 Multi-Status :部分失败 API errors: api error 400: id=e2: field size exceeded        isPermanent(apiErrors)=false —— 类型不匹配 *apiError,会走重试  批 3 → 500              :api error 500        isPermanent=false5xx → 重试;若换成 400/401 则=true,吞掉不重试)  实际出门的批次 metadata:    {"batch_size":"3","public_key":"pk-lf-demo","sdk_integration":"eino","sdk_name":"v0.0.1","sdk_version":"eino"}    ↑ sdk_name="v0.0.1" sdk_version="eino" —— consumer.go:287-288 两行值交叉(真实缺陷)

demo(/tmp/e89demo,纯标准库 + httptest 本地回环)把 client 的三级分类照抄了一遍,metadata 组装逐字照抄源码——所以最后一行不是 demo 的 bug,是源码 bug 的实锤复现。

(二)media 三步上传:base64 图片的旁门

先说为什么需要这个旁门。多模态消息里图片常以 data URI 内联(data:image/png;base64,....),base64 编码膨胀 4/3:一张 500KB 的图变 667KB 字符串。上一篇讲过单事件上限 MaxEventSizeBytes=1MB、超了从最大字段整字段清空——两三张图就会把 input 整个清成 (truncated),回放界面上图片和文字一起消失。

所以消费侧的处理顺序是媒体工序排第一(采样 → 媒体 → 脱敏 → 截断):先把图片从消息里摘出去传成 media,替换成一个几十字节的占位符,再轮到截断时,事件已经瘦身了。

摘取tryNewMediaFromBase64media.go:36-68)只认 data: 前缀的 URL——http(s) 链接本来就是服务端可拉取的,原样保留;解析 data URI 的头(contentType + base64 标记)和负载,解码出原始字节,顺手算 sha256。这个 hash 是后面的去重钥匙。

三步上传consumer.go:392-446):

① POST /api/public/media          问服务端要上传地址     请求带 {traceId, observationId, contentType, contentLength, sha256Hash, field}     响应给 {mediaId, uploadUrl}② PUT  {uploadUrl}                直传对象存储(URL 是服务端签发的预签名地址)     头里同时带 x-amz-checksum-sha256(S3 风格)和 x-ms-blob-type: BlockBlob(Azure 风格)③ PATCH /api/public/media/{id}    上报结果 {uploadedAt, uploadHttpStatus, uploadTimeMs}

三个设计点:

  1. ①是同步的,②③是异步的。
     步骤①在 consumer goroutine 里做(要拿到 mediaId 才能构造占位符,慢不得);②③塞进独立 goroutine(mediaWG.Add(1) + defer Done() + recover() 兜底),不阻塞事件批次出门。而 flush() 的完整语义是 q.join() + mediaWG.Wait()task.go:71-74)——上一篇说"flusher 不调丢最后一批",其实它还等你没传完的图。
  2. 上传成功失败都要 PATCH。
     步骤③不管 ② 的状态码是几都执行,把 uploadHttpStatus 记到服务端——Langfuse 界面上 media 显示"上传失败"而不是无限转圈,靠的就是这个"失败也汇报"。
  3. sha256 是服务端去重钥匙。
     步骤①把 hash 一起报上去,服务端发现同一内容已存在时返回空的 uploadUrl,客户端直接复用 mediaId、跳过②③。同一张图被三个节点引用(prompt 渲染、重试、缓存命中),只传一次。

出门的消息长这样:图片 URL 被替换成占位符 @@@langfuseMedia:type=image/png|id=media-1|source=base64_data_uri@@@,Langfuse 前端渲染时把它还原成 media 引用。而原消息一个字节都没动——convMedias 对每条消息做浅拷贝(consumer.go:328-332:复制 Message 结构体 + 复制 MultiContent 切片),在副本上改 URL。这不是洁癖:handler 拿到的 InMessages 可能还被业务侧持有,观测层改写共享数据等于埋并发雷。

demo 场景 B/C/D 依次验证这三点:

====== 场景 B:base64 图片  三步上传 + 占位符替换 ======  原消息: text + dataURI(解码 16 字节) + httpURL    服务端收到: POST /api/public/media    服务端收到: PUT /obj/media-1    服务端收到: PATCH /api/public/media/media-1  出门消息的图片 URL"@@@langfuseMedia:type=image/png|id=media-1|source=base64_data_uri@@@"  http URL 原样保留:  "https://cdn.example.com/http-only.png"(非 data: 前缀,不走媒体通道)  原消息的图片 URL 仍是 data: 前缀("data:image/png;base6")—— shallow copy 未动原消息====== 场景 C:同内容 hash 去重(第二次零 PUT)======  同一张图传两次:mediaID m1=media-1 m2=media-1(服务端按 sha256 判重复用)  PUT 次数=1(第二次 getUploadURL 返回空 uploadUrl,直接复用)====== 场景 D:媒体异步上传,flush 会等它 ======  PUT 完成PATCH 已到服务端但被 gate 挡住: patchDone=false  flush() 阻塞中 —— 它在等 mediaWG(媒体 goroutine 没结束)  放行后 flush() 返回,PATCH 已完成: true

场景 D 用一个 gate channel 卡住假服务器的 PATCH handler:flush 被验证为确实在等媒体 goroutine——放行前阻塞、放行后返回,这行输出就是 flush = q.join() + mediaWG.Wait() 的行为证明。

还有一个容易漏看的序列化细节:GenerationEventBody 的 InMessages/OutMessage 标的是 json:"-"event.go:260-261)——消息对象不直接进 JSON,消费侧统一 marshal 成字符串塞进 Input/Output 字段。原因是 schema.Message 自身的 JSON 形状不适合直接当观测数据(多模态时 Content 与 MultiContent 的表达冲突),mediaMessage 结构(media.go:78-87)把 MultiContent 提为 content 字段做了一次适配。观测层的数据形状由观测层定义,不迁就业务模型。

(三)mock 测试:两层桩,三个角度

这套集成怎么在不连 Langfuse 的情况下测?源码里有两层 mock 路径:

传输级libs/acl/langfuse/langfuse_test.go:34-46):用字节的 mockey 库直接打桩 (*http.Client).Do,按请求 path 分流返回假响应——getUploadURLPath 返回签好的 URL、ingestionPath 返回空成功。HTTP 一个字节都没出门,但 client 的完整代码路径(构造请求、解析响应、三级分类)全跑到了。

接口级callbacks/langfuse/langfuse_test.go):ACL 层导出了 Langfuse 接口(七方法)+ gomock 生成的 MockLangfuse。但 handler 内部自己调 NewLangfuse 构造真实现,外部注入不进去——测试的组合拳是 mockey.Mock(langfuse.NewLangfuse).Return(mockLangfuse)把构造函数整个换成返回 mock。接口 mock 提供可断言的桩,函数打桩解决"接线在内部"的注入问题。

接口级测试里有三个值得抄的姿势:

  1. 用调用顺序验证树结构。CreateSpan
     的 EXPECT().DoAndReturn 里数调用次数:第 0 次必须没有 ParentObservationID(图级 span),第 1、2 次的 parent 必须是图级 span 的 ID——上一篇"图也是 span、树靠 parent 连"的结论,在这个测试里是被逐调用断言钉死的。
  2. 流式用 Pipe 手工喂 chunk。
     测试不真起模型,schema.Pipe Send 三个 CallbackInput 再 Close(),模拟流式输入的分片到达,验证 handler 的流式拼接逻辑。
  3. 两个 Attack 测试守住边界。TestAttack_NilMessageInOnEnd
    :OnEnd 的 Message 为 nil 时 Usage 必须为 nil(防 panic、防假数据);TestAttack_ExtractModelOutputErrorIgnored:输出拼接失败时 EndGeneration 只允许调一次——注释直说了这是流式双 goroutine 路径的坑。命名带 Attack 的测试是拿来防"恶意/畸形输入"的,这两条正是上篇"流式走另一条 goroutine"的回归防线。

demo 的 fakeServer(httptest + 状态码脚本 + 调用序列记录 + gate)本质上就是传输级 mock 的同构——不需要 mockey,标准库就够。

小结

问题
答案
关键源码
协议长什么样
一个 POST,信封{type, body联合体},Basic 认证
client.go:100-151
部分失败怎么办
207 + errors 数组;但 apiErrors 不匹配重试分类 → 整批重试,upsert 幂等兜底
client.go:136-149
SDK 标识对吗
不对:sdk_name/sdk_version 值交叉(LOW,仅影响展示)
consumer.go:287-288
图片怎么不撑爆管道
先摘成 media 再截断;占位符替换;原消息不动
media.go
 + consumer.go:324-446
图片传几次
sha256 去重,同内容一次;失败也 PATCH 上报
consumer.go:411-413
flush 等不等图片
等:q.join() + mediaWG.Wait()
task.go:71-74
不联网怎么测
传输级 mockey 打桩 http.Do;接口级 gomock + 打桩构造函数
两个 _test.go

几条设计判断:

  • 批量接口要有 207 语义,但客户端的重试分类要认得它。
     "部分成功"聚合成集合类型后逃过了 *apiError 的判定,属于类型设计上的缝隙——幂等 upsert 救了它,但"靠下游幂等兜底"应该是有意为之的设计,不是侥幸碰上。
  • 改写共享数据前先拷贝
    是观测层的铁律。哪怕只是换个 URL 字段,浅拷贝的成本可以忽略,并发雷的排查成本不能。
  • 失败也要汇报
    (PATCH 上报失败状态)是可观测系统的自反性:观测工具自己出了问题,也应该被观测到。
  • 去重键选内容 hash 而不是路径/ID
    :同一张图在 trace 里的不同位置、不同字段(input/output/metadata),天然共享一个 mediaId。

下一篇离开可观测,回到安全:日志和观测数据里不能出现身份证号——PII 脱敏的正则方案 + Hook 链,上一篇埋的 MaskFunc 管道挂点在那里接上完整方案。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 05:09:29 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/954096.html
  2. 运行时间 : 0.274812s [ 吞吐率:3.64req/s ] 内存消耗:4,909.86kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=6ee1f69eaad950cccdba3e3d20f8e2fc
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 4.22 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 10.56 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.11 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000891s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001428s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000735s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000661s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001346s ]
  6. SELECT * FROM `set` [ RunTime:0.000597s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001553s ]
  8. SELECT * FROM `article` WHERE `id` = 954096 LIMIT 1 [ RunTime:0.001134s ]
  9. UPDATE `article` SET `lasttime` = 1787260169 WHERE `id` = 954096 [ RunTime:0.016301s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000693s ]
  11. SELECT * FROM `article` WHERE `id` < 954096 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.012777s ]
  12. SELECT * FROM `article` WHERE `id` > 954096 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001019s ]
  13. SELECT * FROM `article` WHERE `id` < 954096 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.025175s ]
  14. SELECT * FROM `article` WHERE `id` < 954096 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.005032s ]
  15. SELECT * FROM `article` WHERE `id` < 954096 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.010550s ]
0.278736s