swoole_server->addListener [编辑本页]

Swoole提供了swoole_server::addListener来增加监听的端口。业务代码中可以通过调用swoole_server::connection_info来获取某个连接来自于哪个端口。

函数原型:

function swoole_server->addListener(string $host, int $port, $type = SWOOLE_SOCK_TCP);
  • 监听1024以下的端口需要root权限
  • 1.8.0版本增加了多端口监听的功能,监听成功后会返回Swoole\Server\Port对象
  • 在此对象上可以设置另外的事件回调函数和运行参数
  • 监听失败返回false,可调用getLastError方法获取错误码

swoole支持的Socket类型

  • SWOOLE_TCP/SWOOLE_SOCK_TCP tcp ipv4 socket
  • SWOOLE_TCP6/SWOOLE_SOCK_TCP6 tcp ipv6 socket
  • SWOOLE_UDP/SWOOLE_SOCK_UDP udp ipv4 socket
  • SWOOLE_UDP6/SWOOLE_SOCK_UDP6 udp ipv6 socket
  • SWOOLE_UNIX_DGRAM unix socket dgram
  • SWOOLE_UNIX_STREAM unix socket stream

Unix Socket仅在1.7.1+后可用,此模式下$host参数必须填写可访问的文件路径,$port参数忽略
Unix Socket模式下,客户端$fd将不再是数字,而是一个文件路径的字符串
SWOOLE_TCP等是1.7.0+后提供的简写方式,与1.7.0前的SWOOLE_SOCK_TCP是等同的

您可以混合使用UDP/TCP,同时监听内网和外网端口。 示例:

$serv->addlistener("127.0.0.1", 9502, SWOOLE_SOCK_TCP);
$serv->addlistener("192.168.1.100", 9503, SWOOLE_SOCK_TCP);
$serv->addlistener("0.0.0.0", 9504, SWOOLE_SOCK_UDP);
//UnixSocket Stream
$serv->addlistener("/var/run/myserv.sock", 0, SWOOLE_UNIX_STREAM);
//TCP + SSL
$serv->addlistener("127.0.0.1", 9502, SWOOLE_SOCK_TCP | SWOOLE_SSL);

IPv4与IPv6

  • IPv4使用 127.0.0.1表示监听本机,0.0.0.0表示监听所有地址
  • IPv6使用::1表示监听本机,:: (0:0:0:0:0:0:0:0) 表示监听所有地址
  • Linux系统下监听IPv6端口后使用IPv4地址也可以进行连接

随机监听端口

swoole-1.9.6增加了随机监听端口的特性,$port参数可以设置为0,操作系统会随机分配一个可用的端口进行监听。可以读取$listen_port->port获取分配到的端口号。

$port = $serv->addListener("0.0.0.0", 0, SWOOLE_SOCK_TCP);
echo $port->port;

  • Dr杨小昆

    unix socket没有办法监听吗

  • 韩天峰_PHP_Swoole

    unix socket、ipv6、ssl/tls这些都在Swoole的开发规划中,目前1.6的版本内暂时还不会支持。

  • 安达英司

    这个方法是在start()之后使用的吧?

  • Rango-韩天峰

    在start之前。

  • 安达英司

    了解,在看文档,接口顺序写得不错。

  • 朱荣

    addListener 后续会支持 TCP + HTTP/Websocket 混用吗?

  • millken

    为也很期待这个功能

  • askok

    文档比较分散,发个备注。TCP + HTTP/Websocket 可以混用,先创建 websocket 服务,再监听tcp,同时要单独设置tcp监听的配置,覆盖继承的主server配置,例如: $server->listen('127.0.0.1', 9502, SWOOLE_SOCK_TCP)->set( array( 'package_max_length' => 8192, 'open_eof_check'=> true, 'package_eof' => "\r\n" ) );

  • 耳东陈日月明

    监听1024以下的端口,需要root权限。

  • 周星星

    这里的unix socket貌似还需要第三个参数,,示例给的参数貌似不对吧?我这样试是可以的 new swoole_server("/var/run/myserv.sock", 0,SWOOLE_PROCESS,SWOOLE_UNIX_STREAM);