Webman不能替代Zabbix或Prometheus Server,仅提供高性能PHP框架能力;需自行实现采集→判断→告警全链路,或作为轻量webhook接收器转发告警。

Webman 不能替代 Zabbix Server 或 Prometheus Server,它只是个高性能 PHP 框架,所有监控逻辑(采集、判断、告警)都得你手写实现。想用它搭自动化运维监控平台,必须自己补全“数据入口→状态判定→动作触发”整条链路。
Webman 能否直接暴露 /metrics 给 Prometheus 抓取?
可以,但需手动集成 prometheus/client_php 并严格管理指标生命周期:
- 用
composer require prometheus/client_php安装客户端,别手写文本格式——易出错且不兼容新版本 -
CollectorRegistry必须全局单例复用(例如在app/Bootstrap.php中初始化),每次请求 new 一个会导致指标重置、Prometheus 抓到乱序时间序列 - 定义
Gauge类型指标如webman_http_request_duration_seconds(按路由+状态码维度),在中间件中调用$gauge->set()更新;定义Counter如webman_http_requests_total,在请求结束前inc() - 新增控制器(如
app/controller/MetricsController.php),index()方法中调用$registry->render(),返回text/plain; version=0.0.4 - 注意:该接口不带鉴权,生产环境务必通过 Nginx 做 IP 白名单或 Basic Auth 限制访问
如何安全接收 Zabbix Webhook 并转发钉钉/飞书?
这是 Webman 最合理、低风险的监控角色:轻量接收 + 异步分发。
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- Zabbix 端配置媒体类型为 Webhook,URL 填
http://your-webman-host:8787/api/zabbix-alert - Webman 路由中用
$request->getParsedBody()解析 JSON,关键字段包括trigger.status、trigger.severity、host.name、event.id - 务必校验
X-Zabbix-Signature请求头(Zabbix 6.0+ 支持),防止伪造告警刷爆通知通道 - 禁止在请求内直接
curl发钉钉——会阻塞主线程、拖慢整个 HTTP 服务;应redis.lpush('alert:queue', $payload)写入队列 - 另起 Worker 进程(如
app/process/AlertWorker.php)消费队列,失败时重试 + 记录日志,避免消息丢失
为什么 php start.php status 不适合做监控面板?
它只是 Workerman 底层的瞬时快照,不是可采集、可聚合的监控数据源。
- 输出含 ANSI 颜色码(如
\033[32m),程序解析极易崩溃 - 无时间戳、无历史记录,无法画趋势图,更不能喂给 Grafana
- 不包含业务指标:HTTP 耗时、DB 查询次数、Redis 命中率、队列积压量等全都没有
- 没有身份验证和权限控制,不能直接暴露在前端页面上
- 若真要可视化,只能写脚本定期执行并解析输出——成本高、不可靠、难维护
自定义进程做定时检查时,日志和数据库访问为何常静默失败?
自定义进程绕过了 Webman 的标准启动流程,上下文初始化不完整是主因。
- 确保
config/process.php中'handler'值是完整命名空间,如app\TaskCheck::class,且类文件顶部有namespace app; -
onWorkerStart()方法必须是public,且不能带任何类型提示(如Worker $worker),Workerman 不传参 - 所有日志必须走
Log::channel('task')->info(),并在config/log.php中为该 channel 单独配RotatingFileHandler,检查path目录是否存在、权限是否正确(如www-data可写) - 数据库操作必须捕获异常再记录,例如在
Timer::add()回调里用try/catch包裹Db::table()调用,否则异常直接终止定时器 - Windows 下必须用
php windows.php start启动,否则自定义进程根本不会运行

















