自定义进程类必须继承 support\Process,否则脱离 Webman 管理;须放 app/Process/ 目录、实现 onWorkerStart;仅启动 Worker 并调用 listen();TCP/WS 需手动处理粘包、心跳、连接状态;跨进程通信须用 Redis/RabbitMQ。

自定义进程类必须继承 support\Process,不是 Workerman\Worker
直接 extends Workerman\Worker 是最常见、后果最严重的错误。这样写会导致进程完全脱离 Webman 主循环管理:onWorkerStart 不执行、ps aux 看不到子进程、SIGTERM 信号收不到、热重载失效——表面启动成功,实则形同虚设。
正确基类是 support\Process,它负责:注册进程到主事件循环、转发系统信号、兼容 config/process.php 中的 count/user 等配置项。
- 类文件路径必须为
app/Process/YourProcess.php,命名空间需匹配app\Process - 必须实现
public function onWorkerStart($worker),否则启动时报Call to undefined method onWorkerStart - 不要在
onWorkerStart里调用Worker::runAll()—— 这会阻塞当前进程,卡死整个 Webman 主循环
onWorkerStart 里只能启动 Worker 实例并调用 listen()
Webman 的自定义进程本身不处理连接,它只是“启动器”。你要监听 TCP/WS/HTTP,就得在 onWorkerStart 里 new 出 Workerman\Worker 实例,并显式调用 listen(),让 Workerman 自己把它挂进全局事件循环。
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- 示例:
$ws = new Worker('websocket://0.0.0.0:8888');→$ws->count = 1;→$ws->listen(); - 漏掉
listen(),进程看似运行,但端口不监听,客户端 connect 后立刻 EOF - 若设
$ws->count = 2,会 fork 出两个独立 Worker,各自绑定同一端口(需开启reusePort) - 非监听型进程(如定时任务)不写
listen,只靠Timer::add()或消息队列驱动
长连接状态、心跳、粘包全得自己管,没有内置上下文
HTTP 请求有 Request/Response 封装生命周期,而 TCP/WS 连接是裸对象:TcpConnection 断连即销毁,onMessage 收到的是原始字节流,框架不提供连接池、会话上下文或自动心跳。
- 用户 ID、登录态、心跳时间戳、收发缓冲区,都得你自己用数组/Redis 存
- 粘包必须手动拆帧,比如约定前 4 字节为包长度,或用分隔符(
\n) - 心跳检测不能只靠
onClose,要主动Timer::add()检查最后通信时间,超时则$connection->close() - 推送数据前务必检查
$connection->isConnected(),否则会触发 warning 并可能 crash 进程
进程间无共享内存,跨进程通信必须走外部存储
每个自定义进程是独立 PHP 进程,static 变量、全局数组、const 常量都无法互通。HTTP Worker 里触发的任务,想让 WebSocket 进程响应,必须通过中间媒介。
- 轻量级场景用 Redis Pub/Sub:
Redis::publish('task:done', json_encode([...])),WebSocket 进程用Redis::subscribe()监听 - 高可靠场景投递到 RabbitMQ/Kafka,避免 Redis 宕机导致消息丢失
- 严禁用文件轮询或 MySQL 轮询做通信——I/O 开销大、延迟高、易锁表
- 调试时注意:自定义进程日志默认不进
runtime/log/,需手动file_put_contents('php://stderr', ...)或集成 Monolog 单独配置 handler
真正复杂的业务逻辑(比如实时报价推送、多设备状态同步、协议转换网关)不是靠“加一个 process 配置”就能跑起来的。它要求你对连接生命周期、数据帧结构、进程隔离边界有清晰认知——否则上线后出现连接泄漏、消息乱序、状态不同步,排查成本远高于初期设计投入。

















