Laravel - Guzzle:获取 GuzzleHttp\Exception\ConnectException:cURL 错误 6 无法随机解析主机
Laravel - Guzzle: Getting GuzzleHttp\Exception\ConnectException: cURL error 6 Could not resolve host randomly
这可能是我见过的最奇怪的情况。基本上我有一个内置于 Laravel 5.1 的系统,它需要向外部系统发出请求。问题是,有时它有效,但有时我得到
GuzzleHttp\Exception\ConnectException: cURL error 6: Could not resolve host: hosthere
就代码而言,绝对没有任何变化。我 运行 应用程序具有完全相同的参数,但有时会出现错误,有时会得到正确的响应。
有什么想法吗?
提前致谢
编辑 2
当我执行 nslookup domainthatineedtouse.com 我得到
;; Got SERVFAIL reply from 8.8.8.8, trying next server
Server: 8.8.4.4
Address: 8.8.4.4#53
Non-authoritative answer:
Name: domainthatineedtouse.com
Address: therealipaddressishere
这与问题有关吗?
编辑
这是建立连接的 class 的一部分。
<?php
use GuzzleHttp\ClientInterface;
class MyClass
{
const ENDPOINT = 'http://example.com/v1/endpoint';
/**
* @var \GuzzleHttp\ClientInterface
*/
protected $client;
/**
* @var string The api key used to connect to the service
*/
protected $apiKey;
/**
* Constructor.
*
* @param $apiKey
* @param ClientInterface $client
*/
public function __construct($apiKey, ClientInterface $client)
{
$this->client = $client;
$this->apiKey = $apiKey;
}
/**
* Here is where I make the request
*
* @param $param1
* @param $param2
* @return \Psr\Http\Message\ResponseInterface
*/
public function makeTheRequest($param1, $param2)
{
return $this->client->request('get', self::ENDPOINT, [
'query' => [
'api_token' => $this->apiKey,
'parameter_1' => $param1,
'parameter_2' => $param2,
]
]);
}
}
如果您与我们分享实际代码可能会有所帮助。
我现在能说的,有可能是以下两个问题之一:
a) 服务器上的 DNS 设置问题。您需要尝试不同的配置
b) 您正在传递 http://
作为 url 的一部分。
这是人们在调用外部 API 时应该始终预料到的事情,其中大多数都面临中断,包括非常受欢迎的亚马逊产品广告 API。所以请记住,这应该始终放在 try/catch 中,同时使用 do/while 中的重试。
你应该经常捕捉这两种常见的超时,连接超时和请求超时。 \GuzzleHttp\Exception\ConnectException 和 \GuzzleHttp\Exception\RequestException
// query External API
// retry by using a do/while
$retry_count = 0;
do {
try {
$response = json_decode($this->external_service->runOperation($operation));
} catch (\GuzzleHttp\Exception\ConnectException $e) {
// log the error here
Log::Warning('guzzle_connect_exception', [
'url' => $this->request->fullUrl(),
'message' => $e->getMessage()
]);
} catch (\GuzzleHttp\Exception\RequestException $e) {
Log::Warning('guzzle_connection_timeout', [
'url' => $this->request->fullUrl(),
'message' => $e->getMessage()
]);
}
// Do max 5 attempts
if (++$retry_count == 5) {
break;
}
} while(!is_array($response));
希望对您有所帮助。基本上问题与服务器有关:
https://twitter.com/digitalocean/status/844178536835551233
就我而言,我只需要重新启动,现在一切正常。
这可能是我见过的最奇怪的情况。基本上我有一个内置于 Laravel 5.1 的系统,它需要向外部系统发出请求。问题是,有时它有效,但有时我得到
GuzzleHttp\Exception\ConnectException: cURL error 6: Could not resolve host: hosthere
就代码而言,绝对没有任何变化。我 运行 应用程序具有完全相同的参数,但有时会出现错误,有时会得到正确的响应。
有什么想法吗?
提前致谢
编辑 2 当我执行 nslookup domainthatineedtouse.com 我得到
;; Got SERVFAIL reply from 8.8.8.8, trying next server
Server: 8.8.4.4
Address: 8.8.4.4#53
Non-authoritative answer:
Name: domainthatineedtouse.com
Address: therealipaddressishere
这与问题有关吗?
编辑 这是建立连接的 class 的一部分。
<?php
use GuzzleHttp\ClientInterface;
class MyClass
{
const ENDPOINT = 'http://example.com/v1/endpoint';
/**
* @var \GuzzleHttp\ClientInterface
*/
protected $client;
/**
* @var string The api key used to connect to the service
*/
protected $apiKey;
/**
* Constructor.
*
* @param $apiKey
* @param ClientInterface $client
*/
public function __construct($apiKey, ClientInterface $client)
{
$this->client = $client;
$this->apiKey = $apiKey;
}
/**
* Here is where I make the request
*
* @param $param1
* @param $param2
* @return \Psr\Http\Message\ResponseInterface
*/
public function makeTheRequest($param1, $param2)
{
return $this->client->request('get', self::ENDPOINT, [
'query' => [
'api_token' => $this->apiKey,
'parameter_1' => $param1,
'parameter_2' => $param2,
]
]);
}
}
如果您与我们分享实际代码可能会有所帮助。
我现在能说的,有可能是以下两个问题之一:
a) 服务器上的 DNS 设置问题。您需要尝试不同的配置
b) 您正在传递 http://
作为 url 的一部分。
这是人们在调用外部 API 时应该始终预料到的事情,其中大多数都面临中断,包括非常受欢迎的亚马逊产品广告 API。所以请记住,这应该始终放在 try/catch 中,同时使用 do/while 中的重试。
你应该经常捕捉这两种常见的超时,连接超时和请求超时。 \GuzzleHttp\Exception\ConnectException 和 \GuzzleHttp\Exception\RequestException
// query External API
// retry by using a do/while
$retry_count = 0;
do {
try {
$response = json_decode($this->external_service->runOperation($operation));
} catch (\GuzzleHttp\Exception\ConnectException $e) {
// log the error here
Log::Warning('guzzle_connect_exception', [
'url' => $this->request->fullUrl(),
'message' => $e->getMessage()
]);
} catch (\GuzzleHttp\Exception\RequestException $e) {
Log::Warning('guzzle_connection_timeout', [
'url' => $this->request->fullUrl(),
'message' => $e->getMessage()
]);
}
// Do max 5 attempts
if (++$retry_count == 5) {
break;
}
} while(!is_array($response));
希望对您有所帮助。基本上问题与服务器有关:
https://twitter.com/digitalocean/status/844178536835551233
就我而言,我只需要重新启动,现在一切正常。