reusePort
注意
需要workerman>= 3.2.1 PHP>=7.0,Windows系統(tǒng)及 Mac OS 不支持此特性
說明:
bool Worker::$reusePort
設(shè)置當(dāng)前worker是否開啟監(jiān)聽端口復(fù)用(socket的SO_REUSEPORT選項(xiàng))。
開啟監(jiān)聽端口復(fù)用后允許多個無親緣關(guān)系的進(jìn)程監(jiān)聽相同的端口,并且由系統(tǒng)內(nèi)核做負(fù)載均衡,決定將socket連接交給哪個進(jìn)程處理,避免了驚群效應(yīng),可以提升多進(jìn)程短連接應(yīng)用的性能。
注意: 此特性需要PHP版本>=7.0
范例 1
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:8484');
$worker->count = 4;
$worker->reusePort = true;
$worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send('ok');
};
// 運(yùn)行worker
Worker::runAll();
范例2:workerman多端口(多協(xié)議)監(jiān)聽
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('text://0.0.0.0:2015');
$worker->count = 4;
// 每個進(jìn)程啟動后在當(dāng)前進(jìn)程新增一個監(jiān)聽
$worker->onWorkerStart = function($worker)
{
$inner_worker = new Worker('http://0.0.0.0:2016');
/**
* 多個進(jìn)程監(jiān)聽同一個端口(監(jiān)聽套接字不是繼承自父進(jìn)程)
* 需要開啟端口復(fù)用,不然會報(bào)Address already in use錯誤
*/
$inner_worker->reusePort = true;
$inner_worker->onMessage = 'on_message';
// 執(zhí)行監(jiān)聽
$inner_worker->listen();
};
$worker->onMessage = 'on_message';
function on_message(TcpConnection $connection, $data)
{
$connection->send("hello\n");
}
// 運(yùn)行worker
Worker::runAll();