swoole_server->bind [编辑本页]

将连接绑定一个用户定义的ID,可以设置dispatch_mode=5设置已此ID值进行hash固定分配。可以保证某一个UID的连接全部会分配到同一个Worker进程。

在默认的dispatch_mode=2设置下,server会按照socket fd来分配连接数据到不同的worker。因为fd是不稳定的,一个客户端断开后重新连接,fd会发生改变。这样这个客户端的数据就会被分配到别的Worker。使用bind之后就可以按照用户定义的ID进行分配。即使断线重连,相同uid的TCP连接数据会被分配相同的Worker进程。

bool swoole_server::bind(int $fd, int $uid)
  • $fd 连接的文件描述符
  • $uid 指定UID

同一个连接只能被bind一次,如果已经绑定了uid,再次调用bind会返回false
可以使用$serv->connection_info($fd) 查看连接所绑定uid的值


  • 赵赫

    在1.7.8版本 使用bind_uid可以绑定成功,最新版一直返回fasle 是什么情况呢? 系统环境 centos6.6 php5.3

  • 深秋

    123123123

  • 深秋

    [晕]

  • 我行我速的风

    相同uid的TCP连接数据会被分配相同的Worker进程,这么做有什么好处呢? @韩天峰-Rango

  • ffff

    这个需要怎么做呢,有没有事例分享一下呢[给力]

  • 俊杰Jerry

    bind 需要在哪一步调用,用户自定义的uid是通过怎么一个形式传递过来?在websocket的情况下这个还有用么?

  • 小心跳大

    [围观]

  • 止水之约

    UID是在worker进程中确认的,也就是在投递数据到worker进程之后才确认的, 这个功能好像是无效的吧

  • 松帅

    没明白这个到底是怎么工作的: 1) 客户端传一个uid给server,server根据已经绑定的uid来分派worker进程?? 2) uid是谁生成的 ——— 客户端生成并传给server?怎么传给server? server生成的?根据什么规则计算的?怎么保证同一个客户端再次连接得到的依然是同一个uid? 3) 在什么时机调用?swoole源码的例子里是在worker里调用,这个时候是不是代表worker已经分配好了,那还有什么意义?

  • 傻大猫

    比如 同一个房间ID的用户可以在同一个进程里 一起玩

  • 傻大猫

    第三条说的很对啊,不能提前bind

  • 时间线

    请问绑定之后有没有办法解除,我在web上通过转发服务器控制设备,每次的会话id都不同,所以每次会话都会有一个fd绑定到一个会话id上,这样长时间运行会不会导致fd绑定失败

  • Brian

    websocket server可以在onOpen回调中bind,onOpen是在连接创建的时候执行的

  • Bacysoft

    I think so.

  • 刘冰

    bind uid之后,如果可以提供一个方法通过uid获取fd就更好了,当然要保证内部速度够快。现在只能遍历一遍connection_list比对uid,然后得到fd。希望可以通过类似$serv->getFdByUid($uid)这样的方法直接获取$fd

  • 刘冰

    你说的uid是linux操作系统的uid(用户id),与之对应的是gid(分组id)。这里uid是“用户系统membership/account/users”中那个uid,也就是客户端连接提供给服务器的一个唯一标示。这个在做长连接的时候很有用哈

  • 止水之约

    并不是,这里的就是指业务上的uid,这个uid目前有两个问题,第一个是必须执行至少一次业务逻辑(比如登录)之后才能知道哪个uid,第二个是无法自由解绑、绑定。其实这里需要的功能是fd和workerid之间的绑定关系

  • 四季 & 轮回

    可以使用$serv->connection_info($fd) 查看连接所绑定uid的值
    

    但是在onReceive中使用了bind之后还是没有显示绑定的uid 'array(9) { ["server_port"]=> int(9501) ["server_fd"]=> int(3) ["socket_type"]=> int(1) ["remote_port"]=> int(43228) ["remote_ip"]=> string(9) "127.0.0.1" ["from_id"]=> int(0) ["connect_time"]=> int(1492076715) ["last_time"]=> int(1492076715) ["close_errno"]=> int(0) } '

  • 四季 & 轮回

    找到了 'dispatch_mode' => 5, dispatch_mode属性设置的有问题, 貌似一定要是5