reusePort

注意 需要workerman>= 3.2.1 PHP>=7.0,Windows系统及 Mac OS 不支持此特性

说明:

  1. bool Worker::$reusePort

设置当前worker是否开启监听端口复用(socket的SO_REUSEPORT选项)。

开启监听端口复用后允许多个无亲缘关系的进程监听相同的端口,并且由系统内核做负载均衡,决定将socket连接交给哪个进程处理,避免了惊群效应,可以提升多进程短连接应用的性能。

注意: 此特性需要PHP版本>=7.0

范例 1

  1. use Workerman\Worker;
  2. use Workerman\Connection\TcpConnection;
  3. require_once __DIR__ . '/vendor/autoload.php';
  4. $worker = new Worker('websocket://0.0.0.0:8484');
  5. $worker->count = 4;
  6. $worker->reusePort = true;
  7. $worker->onMessage = function(TcpConnection $connection, $data)
  8. {
  9. $connection->send('ok');
  10. };
  11. // 运行worker
  12. Worker::runAll();

范例2:workerman多端口(多协议)监听

  1. use Workerman\Worker;
  2. use Workerman\Connection\TcpConnection;
  3. require_once __DIR__ . '/vendor/autoload.php';
  4. $worker = new Worker('text://0.0.0.0:2015');
  5. $worker->count = 4;
  6. // 每个进程启动后在当前进程新增一个监听
  7. $worker->onWorkerStart = function($worker)
  8. {
  9. $inner_worker = new Worker('http://0.0.0.0:2016');
  10. /**
  11. * 多个进程监听同一个端口(监听套接字不是继承自父进程)
  12. * 需要开启端口复用,不然会报Address already in use错误
  13. */
  14. $inner_worker->reusePort = true;
  15. $inner_worker->onMessage = 'on_message';
  16. // 执行监听
  17. $inner_worker->listen();
  18. };
  19. $worker->onMessage = 'on_message';
  20. function on_message(TcpConnection $connection, $data)
  21. {
  22. $connection->send("hello\n");
  23. }
  24. // 运行worker
  25. Worker::runAll();