reusePort
注意
workerman>= 3.2.1 PHP>=7.0 が必要で、Windowsシステムと Mac OS はこの機能をサポートしていません。
説明:
bool Worker::$reusePort
現在のworkerがポートの再利用(socketのSO_REUSEPORTオプション)を有効にするかどうかを設定します。
ポートの再利用を有効にすると、無関係な複数のプロセスが同じポートをリッスンでき、システムカーネルが負荷分散を行い、どのプロセスがsocket接続を処理するかを決定します。これにより、群発効果を回避し、マルチプロセスの短接続アプリケーションのパフォーマンスを向上させることができます。
注意: この機能は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');
};
// workerを実行
Worker::runAll();
例 2:workermanによるマルチポート(マルチプロトコル)リスニング
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;
// 各プロセス起動後に現在のプロセスに新しいリスナーを追加
$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(TcpConnection $connection, $data)
{
$connection->send("hello\n");
}
// workerを実行
Worker::runAll();