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;
}
}