From b45666d9db6ebeaeef5e908d375e1b59800ab16d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=91=E6=9E=97?= Date: Tue, 31 May 2022 07:46:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ClientAbstracts.php | 12 +- CoroutineClient.php | 261 +++++++++++++++++++++++--------------------- 2 files changed, 143 insertions(+), 130 deletions(-) diff --git a/ClientAbstracts.php b/ClientAbstracts.php index 431e131..8f21a50 100644 --- a/ClientAbstracts.php +++ b/ClientAbstracts.php @@ -47,7 +47,7 @@ abstract class ClientAbstracts implements IClient private int $port = 80; - private array $_responseHeader = []; + private ?array $_responseHeader = []; private int $statusCode = 200; @@ -58,7 +58,7 @@ abstract class ClientAbstracts implements IClient protected int $retryTimeout = 0; - private bool $VERIFYPEER = TRUE; + private bool $verifyPeer = TRUE; /** @@ -124,7 +124,7 @@ abstract class ClientAbstracts implements IClient */ public function withVerifyPeer($bool): static { - $this->VERIFYPEER = $bool; + $this->verifyPeer = $bool; return $this; } @@ -134,7 +134,7 @@ abstract class ClientAbstracts implements IClient */ public function getVerifyPeer(): bool { - return $this->VERIFYPEER; + return $this->verifyPeer; } @@ -167,9 +167,9 @@ abstract class ClientAbstracts implements IClient /** - * @param array $responseHeader + * @param null|array $responseHeader */ - public function setResponseHeader(array $responseHeader): void + public function setResponseHeader(?array $responseHeader): void { $this->_responseHeader = $responseHeader; } diff --git a/CoroutineClient.php b/CoroutineClient.php index 219c61c..3eb944f 100644 --- a/CoroutineClient.php +++ b/CoroutineClient.php @@ -12,6 +12,7 @@ namespace Kiri; use Exception; use Kiri; use Kiri\Abstracts\Logger; +use Psr\Log\LoggerInterface; use Swoole\Coroutine\Http\Client as SwowClient; /** @@ -21,144 +22,156 @@ use Swoole\Coroutine\Http\Client as SwowClient; class CoroutineClient extends ClientAbstracts { - use TSwooleClient; + use TSwooleClient; - /** - * @param string $method - * @param $path - * @param array $params - * @return void - * @throws Exception - */ - public function request(string $method, $path, array $params = []): void - { - if (!str_starts_with($path, '/')) { - $path = '/' . $path; - } - $this->withMethod($method) - ->coroutine( - $path, - $this->paramEncode($params) - ); - } + /** + * @param string $method + * @param $path + * @param array $params + * @return void + * @throws Exception + */ + public function request(string $method, $path, array $params = []): void + { + if (!str_starts_with($path, '/')) { + $path = '/' . $path; + } + $this->withMethod($method) + ->coroutine( + $path, + $this->paramEncode($params) + ); + } - /** - * @param $path - * @return $this - */ - public function withCAInfo($path): static - { - return $this; - } + /** + * @param $path + * @return $this + */ + public function withCAInfo($path): static + { + return $this; + } - /** - * @param $url - * @param array|string $data - * @throws Exception 使用swoole协程方式请求 - */ - private function coroutine($url, array|string $data = []): void - { - try { - $this->generate_client($this->getHost(), $this->isSSL()); - if ($this->client->statusCode < 0) { - throw new Exception($this->client->errMsg); - } + /** + * @param $url + * @param array|string $data + * @throws Exception 使用swoole协程方式请求 + */ + private function coroutine($url, array|string $data = []): void + { + try { + $this->generate_client($this->getHost(), $this->isSSL()); + if ($this->client->statusCode < 0) { + throw new Exception($this->client->errMsg); + } - $this->execute($url, $data); + $this->execute($url, $data); - } catch (\Throwable $exception) { - Kiri::getDi()->get(Logger::class)->error('rpc', [error_trigger_format($exception)]); - $this->setStatusCode(-1); - $this->setBody(jTraceEx($exception)); - } - } + } catch (\Throwable $exception) { + Kiri::getDi()->get(Logger::class)->error('rpc', [error_trigger_format($exception)]); + $this->setStatusCode(-1); + $this->setBody(jTraceEx($exception)); + } + } - /** - * @param $path - * @param $data - * @return void - * @throws Exception - */ - private function execute($path, $data) - { - $this->client->execute($this->setParams($path, $data)); - if (in_array($this->client->getStatusCode(), [502, 404])) { - $this->retry($path, $data); - } else { - $this->setStatusCode($this->client->getStatusCode()); - $this->setBody($this->client->getBody()); - $this->setResponseHeader($this->client->headers); - } - } + /** + * @param $path + * @param $data + * @return void + * @throws Exception + */ + private function execute($path, $data): void + { + $this->client->execute($this->setParams($path, $data)); + if ($this->client->statusCode < 1) { + $logger = Kiri::getDi()->get(LoggerInterface::class); + + $errMsg = sprintf("%s://%s:%s/%s -> error: %s", $this->isSSL() ? "https" : "http", + $this->getHost(), $this->getPort(), $path, $this->client->errMsg); + + $errMsg .= print_r($data, true); + + $logger->error($errMsg); + } + if (in_array($this->client->getStatusCode(), [502, 404])) { + $this->retry($path, $data); + } else { + $this->setStatusCode($this->client->getStatusCode()); + $this->setBody($this->client->getBody()); + $this->setResponseHeader($this->client->headers); + } + } - /** - * @return void - * @throws Exception - */ - private function retry($path, $data) - { - if (Context::increment('retry') <= $this->retryNum) { - sleep($this->retryTimeout); + /** + * @param $path + * @param $data + * @return void + * @throws Exception + */ + private function retry($path, $data): void + { + if (Context::increment('retry') <= $this->retryNum) { + sleep($this->retryTimeout); - $this->execute($path, $data); - } else { - Context::remove('retry'); + $this->execute($path, $data); + } else { + Context::remove('retry'); - $this->setStatusCode(curl_errno($this->client)); - $this->setBody(curl_error($this->client)); - } - } + $this->setStatusCode(curl_errno($this->client)); + $this->setBody(curl_error($this->client)); + } + } - /** - * @param $host - * @param $isHttps - */ - private function generate_client($host, $isHttps): void - { - if ($isHttps || $this->isSSL()) { - $this->client = new SwowClient($host, 443, true); - } else { - $this->client = new SwowClient($host, $this->getPort(), false); - } - $this->client->set($this->settings()); - if (!empty($this->getAgent())) { - $this->withAddedHeader('User-Agent', $this->getAgent()); - } - $this->client->setHeaders($this->getHeader()); - $this->client->setMethod(strtoupper($this->getMethod())); - } + /** + * @param $host + * @param $isHttps + */ + private function generate_client($host, $isHttps): void + { + if ($isHttps || $this->isSSL()) { + $this->client = new SwowClient($host, 443, true); + } else { + $this->client = new SwowClient($host, $this->getPort(), false); + } + $this->client->set($this->settings()); + if (!empty($this->getAgent())) { + $this->withAddedHeader('User-Agent', $this->getAgent()); + } + $this->client->setHeaders($this->getHeader()); + $this->client->setMethod(strtoupper($this->getMethod())); + } - /** - * @param $path - * @param $data - * @return string - */ - private function setParams($path, $data): string - { - $content = $this->getData()->getContents(); - if (!empty($content)) { - $this->client->setData($content); - } - if ($this->isGet()) { - if (!empty($data)) $path .= '?' . $data; - } else { - $data = $this->mergeParams($data); - if (!empty($data)) { - $this->client->setData($data); - } - } - return $path; - } + /** + * @param $path + * @param $data + * @return string + */ + private function setParams($path, $data): string + { + $content = $this->getData()->getContents(); + if (!empty($content)) { + $this->client->setData($content); + } + if ($this->isGet()) { + if (!empty($data)) $path .= '?' . $data; + } else { + $data = $this->mergeParams($data); + if (!empty($data)) { + $this->client->setData($data); + } + } + return $path; + } - /** - * - */ - public function close(): void - { - $this->client->close(); - } + /** + * + */ + public function close(): void + { + $this->client->close(); + } }