MyQEE\Server\Clusters\Client::connect PHP Method

connect() protected method

连接任务服务器
protected connect ( ) : boolean
return boolean
    protected function connect()
    {
        if (!$this->ip) {
            return false;
        }
        if (!$this->port) {
            return false;
        }
        if ($this->socket) {
            # 关闭连接
            $this->close();
        }
        $socket = @stream_socket_client("tcp://{$this->ip}:{$this->port}", $errno, $errstr, 0.3, STREAM_CLIENT_CONNECT);
        if ($errno) {
            Server::$instance->warn("connect tcp://{$this->ip}:{$this->port} error, {$errstr}");
            return false;
        }
        stream_set_timeout($socket, 0, 10);
        # 任务进程没有异步功能, 直接返回
        if (Server::$server->taskworker) {
            return true;
        }
        $eof = \MyQEE\Server\RPC\Server::$EOF;
        $eofLen = -strlen($eof);
        # 加入到事件循环里
        $rs = swoole_event_add($socket, function ($socket) use($eof, $eofLen) {
            $buffer =& $this->buffer;
            $rs = fread($socket, 1);
            if ($rs === '') {
                # 如果有事件响应但是读取了个空字符, 说明服务器已经断开了连接, 调用 close 方法移除对象
                $this->close();
                return;
            }
            $buffer .= $rs;
            while (true) {
                $rs = fread($socket, 4096);
                if ($rs === '') {
                    break;
                }
                if (substr($rs, $eofLen) === $eof) {
                    foreach (explode($eof, rtrim($buffer . $rs)) as $item) {
                        $this->callbackByString($item);
                    }
                    $buffer = '';
                } elseif (strpos($rs, $eof)) {
                    if ($buffer) {
                        $rs = $buffer . $rs;
                    }
                    $arr = explode($eof, $rs);
                    $num = count($arr) - 1;
                    if ($num > 0) {
                        for ($i = 0; $i < $num; $i++) {
                            $this->callbackByString($arr[$i]);
                        }
                    }
                    $buffer = $arr[$num];
                }
            }
        });
        if ($rs) {
            # 绑定
            $obj = new \stdClass();
            $obj->bind = true;
            $obj->id = $this->workerId;
            $str = msgpack_pack($obj) . $eof;
            $len = strlen($str);
            if ($len === fwrite($socket, $str, $len)) {
                $this->socket = $socket;
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }