开发指南
本文引用的文件
- README.md
- Makefile
- scripts/install_deps.sh
- scripts/doctor.sh
- src/main.v
- v.mod
- docs/OVERVIEW.md
- docs/RUNTIME_MODULE_MAP.md
- docs/ARCHITECTURE_REFACTOR_BASELINE.md
- docs/PROTOCOL_PIPELINE_RELAY_ARCHITECTURE.md
- docs/WEBSOCKET_PHASE2_IMPLEMENTATION_PLAN.md
- examples/codexbot-app/phpunit.xml
目录
简介
本指南面向开发者,覆盖从环境搭建、源码编译、依赖安装到单测与集成测试运行的完整流程;同时解释 vhttpd 的架构设计原则、代码组织方式、核心模块职责与相互关系;并提供贡献代码的规范、调试技巧、性能分析与优化建议以及未来发展方向。
vhttpd 是一个基于 V 和 veb 的高性能协议与执行宿主:统一承载 HTTP/WebSocket/Stream/MCP 等协议入口,调度 PHP worker、嵌入式 vjsx 以及其他上游流式执行体,并通过 admin plane 暴露运行时状态与运维能力。
章节来源 - README.md:1-150 - docs/OVERVIEW.md:1-120
项目结构
仓库采用“按主题/角色”逐步演进的组织方式,当前仍以实现为中心分布,但已有明确的重构计划。顶层关键目录与文件: - src:V 语言实现的运行时核心(HTTP 入口、调度、worker 传输、stream/websocket/mcp 运行时、admin 等) - php/package:PHP 侧包与测试 - examples:示例应用与配置 - docs:架构与设计文档 - scripts:依赖安装与环境检查脚本 - Makefile:构建、测试与演示目标
graph TB
A["src/main.v<br/>HTTP 入口与高层编排"] --> B["运行时代码<br/>stream / websocket / mcp / upstream / admin"]
A --> C["worker 传输层<br/>frame / dispatch / SSE / chunk"]
B --> D["外部 Worker / Hosts<br/>php-worker / vjsx 宿主"]
E["scripts/*<br/>依赖安装与环境诊断"] --> A
F["Makefile<br/>构建/测试/演示"] --> A
图表来源 - src/main.v:1-117 - docs/RUNTIME_MODULE_MAP.md:33-77
章节来源 - docs/RUNTIME_MODULE_MAP.md:1-77 - docs/PROTOCOL_PIPELINE_RELAY_ARCHITECTURE.md:370-439
核心组件
- 主入口与路由
- main.v 定义 App 结构体,组合 veb 中间件与静态资源处理器,并将所有通用 HTTP 方法路由到数据平面运行时进行分发。
- 协议与传输
- 负责 worker frame 读写、SSE/text chunk 写出、MCP 与 WebSocket 的 transport 辅助。
- 运行时代码
- stream_runtime、websocket_runtime、mcp_runtime、upstream_runtime、admin_runtime 等分别承担不同协议面与运行时能力。
- 控制面与数据面
- 控制面提供 /admin/* 接口与内部 socket;数据面处理外部请求并委派给内核与后端执行器。
章节来源 - src/main.v:10-117 - docs/RUNTIME_MODULE_MAP.md:33-77 - docs/ARCHITECTURE_REFACTOR_BASELINE.md:160-214
架构总览
vhttpd 将协议入口、传输编排、运行时状态与 PHP worker 桥接分层解耦,遵循“veb 为 HTTP 事实来源”的设计约束,保持核心轻量,聚焦传输、worker 编排、流式生命周期与可观测性。
flowchart TB
Client["客户端 / MCP 客户端"] --> Ingress["协议入口<br/>HTTP / WebSocket / Stream"]
Ingress --> Main["main.v<br/>路由与高层编排"]
Main --> Kernel["内核/调度<br/>统一决策与策略"]
Kernel --> Exec["逻辑执行器<br/>php / vjsx / 未来宿主"]
Kernel --> Transport["传输层<br/>worker frame / SSE / chunk"]
Kernel --> Stream["流式运行时<br/>direct / dispatch / upstream_plan"]
Kernel --> Ws["WebSocket 运行时<br/>hub / rooms / presence"]
Kernel --> Mcp["MCP 运行时<br/>sessions / queue / policy"]
Kernel --> Admin["Admin 运行时<br/>快照 / 统计 / 控制"]
Exec --> PhpWorker["php-worker"]
Exec --> VjsxHost["vjsx 宿主"]
Transport --> PhpWorker
图表来源 - src/main.v:83-117 - docs/ARCHITECTURE_REFACTOR_BASELINE.md:187-214
详细组件分析
主入口与路由(main.v)
- 职责
- 声明 App 结构体,组合 veb.Context 与 request_id 上下文。
- 将所有通用 HTTP 方法映射到 HttpIngressRuntime.route,完成高层分发。
- 提供 trace_id/request_id 解析与事件发射钩子。
- 关键点
- 不持有具体 feature 的状态机,仅做 ingress 与编排。
- 通过 emit 将关键事件上报至控制面。
sequenceDiagram
participant C as "客户端"
participant M as "main.v(App)"
participant R as "HttpIngressRuntime"
participant K as "内核/调度"
participant X as "执行器/传输层"
C->>M : "GET /path"
M->>R : "proxy_get(ctx, path)"
R->>K : "route(GET, path)"
K->>X : "选择执行器/传输策略"
X-->>K : "结果/命令/流片段"
K-->>M : "响应"
M-->>C : "HTTP 响应"
图表来源 - src/main.v:83-117
章节来源 - src/main.v:1-117 - docs/PROTOCOL_PIPELINE_RELAY_ARCHITECTURE.md:370-439
协议与传输层
- 职责
- 定义 worker frame 编码/解码、SSE/text chunk 写出、dispatch 辅助函数。
- 对错误进行分类与超时处理。
- 适用场景
- 修改 worker 通信协议、调整读/写超时行为、扩展新的 stream 写出模式。
章节来源 - docs/RUNTIME_MODULE_MAP.md:58-77
WebSocket Phase 2 模型
- 职责
- vhttpd 拥有连接与会话元数据,worker 仅处理短任务并返回命令列表(send/close/join/broadcast 等)。
- 优势
- 连接与 worker 生命周期解耦,提升可扩展性与稳定性。
flowchart TD
Start(["浏览器建立 WS"]) --> Hub["本地 WS Hub"]
Hub --> Dispatch["事件派发器"]
Dispatch --> Worker["短生命周期 php-worker 任务"]
Worker --> Commands["返回命令列表"]
Commands --> Execute["vhttpd 执行命令"]
Execute --> End(["回写/关闭/广播"])
图表来源 - docs/WEBSOCKET_PHASE2_IMPLEMENTATION_PLAN.md:74-121
章节来源 - docs/WEBSOCKET_PHASE2_IMPLEMENTATION_PLAN.md:51-121
控制面与数据面
- 控制面
- 提供 /admin/* 接口、内部 admin socket、运行时快照、worker/provider 控制。
- 数据面
- 外部 HTTP/WebSocket/MCP/stream 入口、路由归一化、移交内核。
章节来源 - docs/ARCHITECTURE_REFACTOR_BASELINE.md:171-214
依赖与构建
环境准备
- 使用 make 提供的依赖安装目标:
- core:基础构建依赖(OpenSSL、Boehm GC、pkg-config、SQLite/MySQL/PostgreSQL 开发库等)
- vjsx:嵌入式 JS/TS 运行时支持(包含受管理的 QuickJS 源码检出)
- db:默认 DB 能力依赖别名
- full:以上全部
- 推荐步骤
- 安装依赖:make deps-core / make deps-vjsx / make deps-db / make deps-full
- 环境自检:make doctor
章节来源 - Makefile:109-122 - scripts/install_deps.sh:1-138 - scripts/doctor.sh:1-108 - README.md:210-254
编译与产物
- 常用目标
- build/vhttpd:开发构建(默认启用 OpenSSL 与 DB 支持)
- prod/build-prod:生产构建(开启 -prod,日志级别默认 warn)
- build-db:显式启用 DB 支持
- 可选开关
- WITH_DB=0:关闭 DB 支持
- V_TLS_BACKEND=mbedtls:切换 TLS 后端(默认 openssl)
- 产物说明
- 发布包会重写二进制 RPATH/@loader_path,优先加载 runtime/libs 下的捆绑库(libmysqlclient/libpq/libssl/libcrypto/libgc 等),降低部署依赖复杂度。
章节来源 - Makefile:96-107 - README.md:256-271 - README.md:300-366
运行与多监听
- 基本运行
- 通过 --config 或命令行参数启动,支持变量展开与多监听站点配置。
- 多监听模式
- 一个进程绑定多个 host:port,每个站点独立 executor 与 app 配置。
- 服务管理
- 推荐使用 systemd/launchd 前台运行,配合实例单元与配置文件路径。
章节来源 - README.md:428-617 - README.md:367-411
测试与质量
单元测试(V)
- 快速测试
- test-fast:自动发现 src 下非 inproc 且非 db 的 *_test.v 与模块目录
- 指定文件/目录
- 直接传入 .v 文件或目录作为目标,例如 make test src/foo_test.v
- 全量测试
- test-all:编译并运行 src 下所有测试(含重型 inproc 与 db 相关)
章节来源 - Makefile:37-67 - Makefile:163-171 - Makefile:198-199
单元测试(PHP)
- 运行方式
- test-php:遍历 php/package/tests 下 *_test.php 并执行
- 示例工程测试
- examples/codexbot-app 使用 PHPUnit,可通过其 phpunit.xml 配置运行
章节来源 - Makefile:49-64 - Makefile:173-177 - examples/codexbot-app/phpunit.xml:1-18
端到端测试
- 目标
- test-e2e:调用 tests/e2e/run.sh 执行冒烟/验收类测试
章节来源 - Makefile:160-161
贡献规范
代码风格与可读性
- 以“主题/角色”为导向组织新增代码,避免按实现语言/协议分散。
- 在涉及并发与锁的代码中,明确锁层级顺序并在注释中标注,避免逆序加锁。
- 谨慎使用静默错误处理(如 or {}),对 I/O 操作至少补充日志记录。
章节来源 - docs/THEME_REFACTORING_PLAN.md:1-21 - docs/refactor_0601.md:239-249
提交信息格式
- 建议采用“类型 + 范围 + 简述”的结构,例如:
- feat(worker): 增加队列容量上限配置
- fix(stream): 修复 SSE 写出超时边界条件
- refactor(admin): 拆分 admin 运行时为更细粒度模块
- 变更影响面较大时,附带迁移说明与兼容性备注。
[本节为通用实践建议,无需特定文件引用]
Pull Request 流程
- 分支策略
- 功能分支命名:feature/<描述>、fix/<描述>、refactor/<描述>
- 合并前检查
- 确保 make test-fast 与 make test-php 通过
- 如涉及协议/传输变更,补充最小用例或回归测试
- 文档同步
- 对外部可见行为变更,更新 README/docs 对应章节
[本节为通用实践建议,无需特定文件引用]
调试与可观测性
运行时追踪
- 事件追踪
- 关键事件(server.started/failed/stopped、admin.started/failed、internal_admin.error、worker.select.failed)会写入 /tmp/vhttpd_runtime_trace.log,便于定位启动与异常路径。
- Trace/Request ID
- 支持从查询参数、请求头或 veb.request_id 中间件解析 trace_id/request_id,用于跨层关联。
章节来源 - src/main.v:25-81
Admin 面板与 API
- 典型路径
- /admin/runtime、/admin/workers、/admin/stats、/admin/runtime/upstreams/websocket 等
- 用途
- 查看运行时快照、worker 活动、WebSocket 上游事件与发送调试
章节来源 - docs/OVERVIEW.md:199-228
日志与事件
- 事件日志
- 通过 --event-log 输出 NDJSON 事件,便于离线分析
- 结构化日志
- 建议在后续阶段引入 JSON 模式与模块级日志级别控制
章节来源 - README.md:428-435 - docs/refactor_0601.md:366-376
性能分析与优化建议
构建与运行时优化
- 生产构建
- 使用 prod/build-prod 目标,开启 -prod 与 -nocache,减少调试开销
- 内存与 GC
- 根据平台自动选择 Boehm GC,必要时通过 VPHP_V_GC 显式指定
- 数据库支持
- 默认启用 enable_db;若不需要可关闭以减少链接体积与依赖
章节来源 - Makefile:17-26 - Makefile:31-35 - README.md:256-271
并发与锁
- 建议
- 统一锁层级并文档化,读多写少场景考虑 RwMutex
- 对于 lane/task slot 通信,评估使用 chan 替代 Mutex+ready 标志
- 风险
- 移除 unsafe 后需基准验证性能回退
章节来源 - docs/refactor_0601.md:46-52 - docs/refactor_0601.md:425-431
流式与队列
- 流式
- 合理设置 read_timeout_ms、queue_capacity、queue_timeout_ms,避免长连接阻塞与队列溢出
- 队列语义
- 队列满返回 503(x-vhttpd-error-class: worker_queue_full),等待超时返回 504(worker_queue_timeout)
章节来源 - README.md:229-252
故障排查
常见构建问题
- 缺少系统依赖
- 使用 make deps-* 安装必要包,再用 make doctor 校验
- QuickJS 源未就绪
- 确保 vjsx 已检出且 ensure-quickjs.sh 可用;本地 ../quickjs 优先匹配
章节来源 - scripts/install_deps.sh:86-115 - scripts/doctor.sh:54-81
运行时问题
- 启动失败/崩溃
- 检查 /tmp/vhttpd_runtime_trace.log 中的 server.* 事件
- 关注 provider_registry 废弃函数 panic 风险,替换为 error 返回
- 队列拥塞
- 观察 /admin/runtime 与 /admin/stats,适当增大 pool_size 或队列容量
章节来源 - src/main.v:75-81 - docs/refactor_0601.md:239-249 - README.md:229-252
结论与路线图
- 结论
- vhttpd 以 veb 为 HTTP 事实来源,围绕协议入口、传输编排、运行时状态与 worker 桥接形成清晰分层;通过 admin plane 提供可观测与运维能力。
- 路线图要点
- 止血与稳定性:消除 panic、审计静默错误、清理硬编码路径
- 测试与重组:完善 CI 测试、按主题重组目录
- 架构重构:子模块拆分、App 结构体拆分、契约稳定化
- 安全与并发:移除 unsafe、优化锁顺序与粒度
- 可观测性:Prometheus 指标、结构化日志、模块级日志级别
- 工程化:依赖锁定、Docker 镜像、配置校验