账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    php stream_socket_pair 乱入如何解决??
    55
    0

    本来使用 stream_socket_pair 是用来父子进程间通信的,实现多进程下,某个子进程消息通过父进程转发给其他子进程(类似于 qq),但是这碰到了一个问题:

    $count     = 4;
    $childConn = [];
    $parent    = null;
    
    for ($i = 0; $i < $count; ++$i)
    {
        $pair = stream_socket_pair(STREAM_PF_UNIX , STREAM_SOCK_STREAM , STREAM_IPRROTO_IP);
        $pid = pcntl_fork();
        
        if ($pid < 0) {
            throw new Exception("创建子进程失败");
        } else if ($pid > 0) {
            fclose($pair[1]);
            $child = $pair[0];
            $childConn[$pid] = $child;
            // 监听子进程消息
            listenChild($child); 
        } else {
            fclose($pair[0]);
            $parent = $pair[1];
            // 监听父进程消息
            listenParent($parent);
        }
    }

    以上目的就是为每个子进程创建与父进程的通信通道,然结果却发生了令人意外的效果!

    比如下面一个通信过程:

    父进程pid: 30246
    子进程pid: 30247 30248 30249 30250,每个子进程中都监听客户端连接。
    
    1. 客户端A 进入子进程 30247
    2. 客户端B 进入子进程 30248
    3. A 客户端发送消息,子进程 30247 接受到消息,要求转发给 30248 中的客户端 B
    4. 子进程 30247 调用事先保存的 $parent(与父进程的通信连接),发送消息
    ... 意外产生了!!
    你可能想当然的以为,他绝对是发送给父进程(30246)!
    而实际上不是!结果可能是其他子进程!
    到这儿,我就很郁闷了,stream_socket_pair 创建的成对套接字,怎么会发生这种现象??

    我表示特别无语了 ....跪求大神解救

    4
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 半抹灯花 普通会员 1楼
      502 Bad Gateway

      502 Bad Gateway


      nginx
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部