例如我啟動(dòng)多個(gè)workman,使用相同的端口。linux3.10以上內(nèi)核已經(jīng)支持端口復(fù)用,swoole雖然可以,但是我想用workman來(lái)做。另外看到php socket文檔也有個(gè)端口復(fù)用的設(shè)置函數(shù),但是為什么我啟動(dòng)多個(gè)workman不可以相同端口呢?下面是php的端口復(fù)用設(shè)置
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)
workerman的端口是與協(xié)議綁定的,如果您打算在一個(gè)端口上實(shí)現(xiàn)不同的協(xié)議,個(gè)人覺(jué)得,目前不支持。
workerman 支持端口復(fù)用。
以下摘自手冊(cè):http://doc.workerman.net/worker/reuse-port.html
bool Worker::$reusePort
設(shè)置當(dāng)前worker是否開(kāi)啟監(jiān)聽(tīng)端口復(fù)用(socket的SO_REUSEPORT選項(xiàng))。
開(kāi)啟監(jiān)聽(tīng)端口復(fù)用后允許多個(gè)無(wú)親緣關(guān)系的進(jìn)程監(jiān)聽(tīng)相同的端口,并且由系統(tǒng)內(nèi)核做負(fù)載均衡,決定將socket連接交給哪個(gè)進(jìn)程處理,避免了驚群效應(yīng),可以提升多進(jìn)程短連接應(yīng)用的性能。
注意: 此特性需要PHP版本>=7.0
注意: 從workerman 3.5.21版本開(kāi)始默認(rèn)開(kāi)啟此選項(xiàng)。之前版本需要手動(dòng)設(shè)置Worker::$reusePort=true;
開(kāi)啟。
范例 1
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');
};
// 運(yùn)行worker
Worker::runAll();
范例2:workerman多端口(多協(xié)議)監(jiān)聽(tīng)
use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';
$worker = new Worker('text://0.0.0.0:2015');
$worker->count = 4;
// 每個(gè)進(jìn)程啟動(dòng)后在當(dāng)前進(jìn)程新增一個(gè)監(jiān)聽(tīng)
$worker->onWorkerStart = function($worker)
{
$inner_worker = new Worker('http://0.0.0.0:2016');
/**
* 多個(gè)進(jìn)程監(jiān)聽(tīng)同一個(gè)端口(監(jiān)聽(tīng)套接字不是繼承自父進(jìn)程)
* 需要開(kāi)啟端口復(fù)用,不然會(huì)報(bào)Address already in use錯(cuò)誤
*/
$inner_worker->reusePort = true;
$inner_worker->onMessage = 'on_message';
// 執(zhí)行監(jiān)聽(tīng)
$inner_worker->listen();
};
$worker->onMessage = 'on_message';
function on_message($connection, $data)
{
$connection->send("hello\n");
}
// 運(yùn)行worker
Worker::runAll();