Webman虽无内置物业模型,但凭协程、连接池、中间件链和进程隔离可支撑高并发多租户物业系统;须用域名识别租户、最早中间件绑定上下文并销毁、独立PDO连接、Nginx接管前端路由、接口显式注册。

Webman 本身不提供物业管理领域模型,但它的协程、连接池、中间件链和进程隔离能力,足以支撑高并发、多租户、强事务的物业系统——关键在于如何把「缴费」「报修」「巡检」这些业务动作,映射到 Webman 的生命周期与资源调度上。
租户隔离必须从请求入口就绑定
小区物业系统天然多租户(每个小区一个独立运营主体),不能靠 URL 参数识别租户,否则静态资源、WebSocket 推送、定时任务都会漏掉上下文。
- 用域名识别:比如
shanghai-huayuan.example.com→ 提取shanghai-huayuan查租户表 - 中间件必须在
app/middleware/TenantMiddleware.php中最早执行:TenantContext::setContext(['id' => $tenantId, 'db_name' => 'tenant_' . $tenantId]) - 务必在中间件末尾调用
TenantContext::destroy(),否则协程复用时会把 A 小区的数据写进 B 小区的库 - 不要在
onWorkerStart或全局变量里缓存租户配置——那是进程级的,不是请求级的
报修工单这类强一致性操作,别直接走 HTTP 同步调用
用户提交报修后,若立刻同步调用「派单服务」+「短信通知服务」+「工单存档服务」,任意一环超时或失败,整个流程就卡死或状态不一致。
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- 用
Swoole\Coroutine\Http\Client发异步请求,设timeout=2.5,超时就降级为本地队列暂存 - 核心状态变更(如工单创建)必须走本地事务:
Db::transaction(fn() => { ... }) - 非关键动作(如微信模板消息、邮件归档)全部投递到
Redis Stream,由独立消费者进程处理 - 避免在控制器里写
file_get_contents或curl_exec—— 这会阻塞整个 Worker
缴费和账单生成要绕过默认 PDO 连接池
Webman 默认的 database.php 配置是单库单连接池,但物业系统要求每个小区用独立数据库(tenant_shanghai.db_bill、tenant_beijing.db_bill),而 PDO 连接池不支持运行时切换 dbname。
- 不能改
config/database.php里的'database' => 'xxx'占位符——连接池初始化后就固定了 - 应在
TenantContext::setContext()后,手动 new 一个PDO实例:new PDO("mysql:host=127.0.0.1;dbname={$dbName}", $user, $pass) - 把这个实例绑定到 DI 容器:
Container::set('db.tenant', $pdo),模型基类里统一用它 - 注意:每次请求都新建 PDO 实例没问题,Swoole 协程下开销极低;但别把它存成静态变量或全局变量
Nginx 必须接管前端路由,别让 Webman 处理 /admin/xxx 刷新
物业后台用 Vue3 开发,部署在 public/admin/ 下。如果只靠 Webman 的 Route::any('/admin', ...),用户刷新 /admin/repair/123 会 404——因为 Nginx 根本没把请求转发过来。
- Nginx 配置里加
location ^~ /admin/ { alias /path/to/webman/public/admin/; try_files $uri $uri/ /admin/index.html; } -
vite.config.ts中base: '/admin/'必须和 Nginx 的alias路径严格一致 - 禁止把前端构建产物放到
app/或resources/目录——Webman 不托管这些路径下的静态文件 - 接口路径要显式注册:
Route::group('/api', function () { Route::post('/bill/pay', [PayController::class, 'submit']); });,别依赖自动解析
真正难的不是写代码,而是确保「租户上下文贯穿全程」「连接不跨租户复用」「前端路由不被 Nginx 截断」这三件事在每一次请求里都成立——线上故障,90% 出在这三个点上。


















