workerman需手动实现http路由,通过解析请求路径、匹配预定义规则(精确/前缀/正则)并调用对应处理逻辑;推荐用$request->geturi()->getpath()提取纯净path,trim后匹配,未命中返回404。

Workerman 本身不内置 HTTP 路由功能,但通过解析 $_SERVER['REQUEST_URI'] 或 $request->getUri()->getPath()(配合 Worker\Protocols\Http\Request),可手动实现轻量级 path 路由分发。核心思路是:提取请求路径、逐条匹配预定义规则、调用对应处理逻辑。
提取并规范化请求路径
HTTP 请求对象中路径可能带查询参数(如 /api/user?id=1),路由匹配应只关注 path 部分:
- 使用
$request->getUri()->getPath()直接获取纯净 path(推荐,兼容 PSR-7) - 若用原生方式,可用
parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)提取 - 建议统一去除首尾斜杠,例如
trim($path, '/'),便于后续规则书写(如匹配user/list而非/user/list/)
支持多种匹配模式的简单路由表
可构建一个数组路由表,每项包含 path 模式与回调。支持三种常用形式:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
精确匹配:字符串全等,如
'user/info' => [$handler, 'infoAction'] -
前缀匹配:用
strpos($path, $rule) === 0判断,适合 API 版本路由(如'v1/user'匹配v1/user/1) -
正则匹配:规则以
^开头、$结尾(如'^post/(\d+)$'),用preg_match提取参数
在 onRequest 回调中执行路由分发
在 Worker 启动时注册 onRequest 回调,内部完成路径解析 + 路由查找 + 执行:
- 先 normalize 路径,再遍历路由表,按顺序尝试匹配(注意顺序优先级)
- 匹配成功后,将提取的参数(如正则子组)和原始
$request一并传给 handler - 未匹配时返回
404响应,避免静默失败 - 示例片段:
$router = [
'home' => fn($req) => "Welcome",
'^user/(\d+)$' => fn($req, $id) => "User {$id}",
];
$path = trim($request->getUri()->getPath(), '/');
foreach ($router as $pattern => $handler) {
if (str_starts_with($pattern, '^')) {
if (preg_match($pattern, $path, $matches)) {
array_shift($matches); // 去掉完整匹配项
return $response->withStatus(200)->end(call_user_func($handler, $request, ...$matches));
}
} elseif ($path === $pattern) {
return $response->withStatus(200)->end(call_user_func($handler, $request));
}
}
return $response->withStatus(404)->end('Not Found');
?>
注意事项与轻量替代建议
该方案适合小项目或学习理解,实际使用需注意:
- 路由表应静态初始化,避免每次请求重复构建
- 不支持中间件、分组、命名路由等高级特性;如需扩展,建议接入 Slim、FastRoute 等成熟组件
- 注意 URL 编码问题(如空格变
+或%20),getPath()已解码,无需额外处理 - 若项目已用 Composer,可直接
require workerman/http并搭配fast-route使用,几行代码即可获得高性能路由










