workerman最大连接数需应用层与系统层协同控制:先设$worker->maxconnections为系统软限制的70%~80%,再通过systemd或supervisord同步调高limitnofile或ulimit -n,并重启主进程生效。

要限制 Workerman 5.2.3 的最大客户端连接数,不能只改一个地方——它由 应用层配置 和 系统资源限制 共同决定。设得太高会触发 Too many open files,设得太低又浪费性能。关键在于两层协同控制。
设置 Worker::$maxConnections(应用层硬限)
这是最直接的控制点,在启动脚本中为每个 Worker 实例指定上限:use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:2346');
// 必须在 $worker->listen() 之前设置
$worker->maxConnections = 20000; // 示例值,非随意填写
$worker->count = 8; // 建议设为 CPU 核心数的 1.5 倍左右
$worker->reusePort = true;
$worker->onMessage = function($connection, $data) {
$connection->send("echo: $data");
};
Worker::runAll();
⚠️ 注意:
-
$worker->maxConnections是该 Worker 实例能接受的最大并发连接数(不是整个进程或所有 Worker 总和); - 若你启用了多个 Worker(如 TCP + WebSocket 同时监听),每类连接都独立受各自
maxConnections限制; - 这个值必须 ≤ 当前进程实际可用的文件描述符软限制(soft limit)的 70%~80%,否则连接会在系统层被拒绝,Workerman 不报错、不记录,只卡在
SYN_RECV。
同步调高系统文件描述符限制(系统层底线)
Workerman 每个连接、每个定时器、每条日志流、每个 Redis 连接都会占用一个 fd。若系统只允许打开 1024 个文件,那 `maxConnections = 20000` 完全无效。查真实限制:
pid=$(pgrep -f "start.php" | head -1) cat /proc/$pid/limits | grep "Max open files"
输出类似 1024 1024 files,说明还没生效。
分场景加固:
-
systemd 管理(推荐生产环境)
编辑/etc/systemd/system/workerman.service,在[Service]下加:LimitNOFILE=65535
执行:
sudo systemctl daemon-reload sudo systemctl restart workerman
-
supervisord 管理
在supervisord.conf的[program:workerman]段中,改command为:command=/bin/sh -c "ulimit -n 65535 && php start.php start -d"
然后:
supervisorctl reread supervisorctl update supervisorctl restart workerman
-
手动启动(测试用)
ulimit -n 65535 && php start.php start -d
✅ 改完务必重启主进程(不是 reload),因为 fd 限制只在 fork 子进程时读取一次。
配合其他关键参数一起调优
光设 `maxConnections` 不够,还需配套调整:-
$worker->count:设为nproc返回的核心数 × 1.5(例如 8 核 → 设 12),再多反而因调度开销降低吞吐; -
$worker->reusePort = true:启用内核级连接负载均衡,避免单个 Worker 队列堆积; - 不要忽略后端依赖:Redis 连接、数据库连接、DNS 查询也占 fd,所以
maxConnections最好按系统软限制的 70%~80% 设置(如软限 65535 → 设 45000~52000); - 检查
net.core.somaxconn(默认常为 128),必要时调大:echo 'net.core.somaxconn = 65535' >> /etc/sysctl.conf sysctl -p
不复杂但容易忽略。











