Laravel - Guzzle:获取GuzzleHttp \ Exception \ ConnectException:cURL错误6无法随机解析主机

时间:2017-03-21 16:58:50

标签: php curl laravel-5.1

这可能是我见过的最奇怪的情况。基本上我有一个内置在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

这可能与此问题有关吗?

修改 这是进行连接的类的一部分。

<?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,
            ]
        ]);
    }
}

3 个答案:

答案 0 :(得分:1)

这是人们在调用外部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));

答案 1 :(得分:0)

如果您与我们分享实际代码可能会有所帮助。

我现在可以说,有机会成为两个问题之一:

a)服务器上的DNS设置问题。您需要尝试不同的配置

b)您将http://作为网址的一部分传递。

答案 2 :(得分:0)

我希望这会有所帮助。基本上问题与服务器有关:

https://twitter.com/digitalocean/status/844178536835551233

在我的情况下,我只需要重新启动,现在一切都很好。