Workerman中为不同业务分配独立进程组,需创建多个Worker实例并分别设置name、count、监听地址及隔离回调,确保命名唯一、日志分离、资源可控,且禁止复用同一实例承载多业务。

在Workerman中为不同业务分配独立进程组,能避免相互干扰、便于单独扩缩容和故障隔离。比如聊天消息处理和订单通知推送必须分开运行,不能共用同一组Worker进程。
创建多个独立Worker实例
每个业务对应一个独立的Worker对象,监听不同端口或相同端口但协议/路径不同。不要复用同一个Worker实例去承载多个业务逻辑。
在启动文件(如start.php)中依次定义两个Worker:
第一个Worker处理聊天业务:
```php
$chat_worker = new Worker('websocket://0.0.0.0:7272');
$chat_worker->name = 'ChatWorker';
$chat_worker->count = 3;
```
第二个Worker处理订单通知:
```php
$notify_worker = new Worker('tcp://0.0.0.0:7273');
$notify_worker->name = 'NotifyWorker';
$notify_worker->count = 2;
```
两个Worker的onMessage回调函数必须完全分离,各自封装对应业务逻辑,禁止交叉调用。
用Worker::setEventLoopClass指定事件循环(可选)
当某类业务对IO延迟极其敏感(如实时音视频信令),可为其Worker单独指定Libevent事件循环,而其他业务仍用默认Select:
```php
if (extension_loaded('libevent')) {
$chat_worker->setEventLoopClass('Workerman\Events\Libevent');
}
```
这一步不是必须,但能确保高优先级业务获得更稳定的响应时间。注意:启用Libevent需提前安装PHP libevent扩展,否则会报错退出。
进程组命名与日志隔离
为每个Worker设置唯一name属性,这是区分进程组的关键标识:
```php
$chat_worker->name = 'ChatWorker';
$notify_worker->name = 'NotifyWorker';
```
启动后执行 php start.php status,输出中将清晰列出两组进程及其PID范围,互不重叠。
【name值必须全局唯一】 若两个Worker使用相同name,Workerman会拒绝启动并抛出Fatal Error。
日志也自动按name分目录写入:logs/ChatWorker/ 和 logs/NotifyWorker/,无需额外配置。
进程组资源限制(Linux系统)
通过systemd或supervisord管理时,可为不同进程组设置独立资源上限:
方法一:用systemd为ChatWorker单独建service文件,加入以下限制:
```ini
MemoryLimit=512M
CPUQuota=60%
TasksMax=200
```
方法二:用supervisord的numprocs和priority控制启动顺序与数量,但无法硬限内存;真正需要资源隔离时,必须用cgroup或容器。
这一步操作起来很简单,直接把配置写进service文件就行。但要注意:若用supervisord管理多个Worker,务必为每个Worker定义独立的program段,不能合并成一个program启动所有业务。

















