例如我启动多个workman,使用相同的端口。linux3.10以上内核已经支持端口复用,swoole虽然可以,但是我想用workman来做。另外看到php socket文档也有个端口复用的设置函数,但是为什么我启动多个workman不可以相同端口呢?下面是php的端口复用设置
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)
workerman的端口是与协议绑定的,如果您打算在一个端口上实现不同的协议,个人觉得,目前不支持。
不是哦 我是相同协议 多个进程监听
workerman 支持端口复用。
以下摘自手册:http://doc.workerman.net/worker/reuse-port.html
bool Worker::$reusePort
设置当前worker是否开启监听端口复用(socket的SO_REUSEPORT选项)。 开启监听端口复用后允许多个无亲缘关系的进程监听相同的端口,并且由系统内核做负载均衡,决定将socket连接交给哪个进程处理,避免了惊群效应,可以提升多进程短连接应用的性能。
注意: 此特性需要PHP版本>=7.0 注意: 从workerman 3.5.21版本开始默认开启此选项。之前版本需要手动设置Worker::$reusePort=true;开启。 范例 1
Worker::$reusePort=true;
use Workerman\Worker; require_once __DIR__ . '/Workerman/Autoloader.php'; $worker = new Worker('websocket://0.0.0.0:8484'); $worker->count = 4; $worker->reusePort = true; $worker->onMessage = function($connection, $data) { $connection->send('ok'); }; // 运行worker Worker::runAll();
范例2:workerman多端口(多协议)监听
use Workerman\Worker; require_once __DIR__ . '/Workerman/Autoloader.php'; $worker = new Worker('text://0.0.0.0:2015'); $worker->count = 4; // 每个进程启动后在当前进程新增一个监听 $worker->onWorkerStart = function($worker) { $inner_worker = new Worker('http://0.0.0.0:2016'); /** * 多个进程监听同一个端口(监听套接字不是继承自父进程) * 需要开启端口复用,不然会报Address already in use错误 */ $inner_worker->reusePort = true; $inner_worker->onMessage = 'on_message'; // 执行监听 $inner_worker->listen(); }; $worker->onMessage = 'on_message'; function on_message($connection, $data) { $connection->send("hello\n"); } // 运行worker Worker::runAll();
谢谢大佬
workerman的端口是与协议绑定的,如果您打算在一个端口上实现不同的协议,个人觉得,目前不支持。
不是哦 我是相同协议 多个进程监听
workerman 支持端口复用。
以下摘自手册:http://doc.workerman.net/worker/reuse-port.html
设置当前worker是否开启监听端口复用(socket的SO_REUSEPORT选项)。
开启监听端口复用后允许多个无亲缘关系的进程监听相同的端口,并且由系统内核做负载均衡,决定将socket连接交给哪个进程处理,避免了惊群效应,可以提升多进程短连接应用的性能。
注意: 此特性需要PHP版本>=7.0
注意: 从workerman 3.5.21版本开始默认开启此选项。之前版本需要手动设置
Worker::$reusePort=true;
开启。范例 1
范例2:workerman多端口(多协议)监听
谢谢大佬