单纯靠Composer无法封装HTTP/gRPC/Thrift统一路由层,因三者协议抽象层级不同:HTTP路由依赖PSR-7解析path/method,gRPC/Thrift路由由协议栈(grpc.so/TProcessor)在序列化后硬编码分发,需Linkerd/Envoy等服务网格在四至七层通过ALPN、帧头识别实现协议分流。

单纯靠 Composer 安装几个包,没法直接“封装出支持 HTTP/gRPC/Thrift 的路由层”——因为这三类协议的路由机制根本不在同一抽象层级上,不能靠 PHP 类库统一 dispatch。
HTTP 路由可以用 Composer 包,但仅限于 PSR-7 兼容场景
像 amphp/http-server-router 或 nikic/fast-route 这类库,本质是解析 HTTP 请求的 path、method、host 等字段,然后匹配回调或控制器。它们只处理 HTTP 语义层,不碰协议底层。
- 适用场景:你用 PHP 写 HTTP API 服务,需要轻量级路由分发
- 不适用场景:gRPC 请求打进来时,它根本不是合法 HTTP 请求(比如没有
Content-Type: application/grpc以外的常规 header,路径也不符合 REST 约定),FastRoute 直接 parse 失败 - 典型错误现象:
Uncaught TypeError: Argument 1 passed to FastRoute\Dispatcher\GroupCountBased::dispatch() must be of the type string, null given—— 因为 gRPC 的二进制帧被当成了空 path - 参数差异:HTTP 路由器依赖
ServerRequestInterface,而 gRPC 服务端需接收Grpc\Server实例或io.grpc.Server(Java)这类原生对象
gRPC 和 Thrift 的路由必须由协议栈自身控制
gRPC 没有“路由”概念,只有 service/method 名字映射到 handler;Thrift 同理,靠 TProcessor 分发 method 调用。这些都发生在序列化之后、业务逻辑之前,PHP 层无法用通用 Router 插入中间逻辑。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- gRPC 的 dispatch 在 C 扩展里完成:
grpc.so解析帧 → 提取/package.Service/Method→ 查表调用 PHP callback - Thrift 的 dispatch 由
TProcessor实现,比如TBaseProcessor读取 method name 字符串后 switch-case 分发 - 你不能在
composer require grpc/grpc后,往里面塞一个 “通用路由中间件”——它连请求对象都不暴露给你 - 想做多协议共存?只能并行启动多个监听端口:HTTP 用
amphp/http-server,gRPC 用Grpc\Server,Thrift 用TServerSocket,各自独立运行
真要统一入口,得靠反向代理或服务网格(Linkerd / Envoy)
Linkerd 的 routers 配置能区分协议类型,是因为它工作在网络四层和七层之间,靠 ALPN 协商、TLS SNI、HTTP/2 帧头识别等机制判断协议,再分流到不同后端。这不是 PHP 库能模拟的。
- HTTP 流量走 Linkerd 的
protocol: httprouter - gRPC 流量走
protocol: h2或显式标记protocol: grpc(Linkerd 2.12+ 支持) - Thrift 流量需自行定义
protocol: thrift并配置thriftMux解析器,且要求客户端带特定 magic bytes - PHP 应用只需专注实现各协议的 handler,不参与协议识别和路由决策
最容易被忽略的一点:gRPC 和 Thrift 的“路由”实际发生在 IDL 编译阶段——protoc --php_out=. 生成的 class 已硬编码了 service/method 映射关系,运行时无法动态增删 endpoint。所谓“多协议路由层”,本质是运维侧的流量调度问题,不是 PHP 层的代码组织问题。


















