使用 Guzzle 捕获 CUrl 超时异常

Posted

技术标签:

【中文标题】使用 Guzzle 捕获 CUrl 超时异常【英文标题】:Catch CUrl Timout Exceptions with Guzzle 【发布时间】:2020-10-23 23:39:48 【问题描述】:

我正在尝试检索少数网站的 html。我使用的是 php file_get_contents,它工作得非常好,但速度很慢而且有点受限,所以我决定尝试 Guzzle。不幸的是,我发现即使使用记录在案的异常处理,也很难阻止 Guzzle 抛出异常。我的代码很简单:

    $websiteFQDN = 'http://acme.biz';

    $client = new \GuzzleHttp\Client(['http_errors' => false,'verify' => false, 'connect_timeout' => 121 ]);

    echo '<h3>'.$websiteFQDN.'</h3>';
    try 
        $res = $client->request('GET', $websiteFQDN);
        echo '<p>Appears Successful</p>';
    
    catch (RequestException $e)
        echo '<p>Exception Caught</p>';
    

我不断收到以下错误:

GuzzleHttp\Exception\ConnectException cURL 错误 28:无法连接到 acme.biz 端口 80:超时(请参阅https://curl.haxx.se/libcurl/c/libcurl-errors.html)

关于为什么上面没有捕捉到异常并允许进程继续的任何建议?在我的测试中,它遍历了大约 20 个没有问题的域,但随后我得到了上面的错误并杀死了它。

Laravel 7.0 |狂饮7.0.1 | PHP 7.2.5

有人建议尝试 Laravel HTTP 客户端,但不幸的是它遇到了同样的问题,因为它使用 Guzzle,而 Guzzle 又似乎使用 CUrl,我所做的只是添加抽象层。我用这段代码试了一下:

    $response = Http::withOptions(['verify' => false])->get($websiteFQDN);
    if($response->successful())
        echo '<p>Appears Successful</p>';
    else
        echo '<p>Exception Caught</p>';
    

当我尝试使用 Laravel HTTP vanilla 时,我收到“cURL 错误 60:SSL 证书”错误 mentioned here。我将 'verify' => false Guzzle 选项添加到 HTTP 客户端,该选项将其传递给 Guzze(就像我使用 Guzzle 时所做的那样),解决了这个问题,它可以通过更多域。 然后我得到错误: ConnectionException cURL 错误 28:无法连接到www.acme.biz 端口 80:超时 这是我在使用 Guzzle 时得到的结果

我假设必须有一种方法可以处理域列表并获取它们的 HTML,而不会出现异常终止进程?

【问题讨论】:

【参考方案1】:

您正在使用 Laravel 7.x

你也可以使用 Laravel 提供的 HTTP-CLIENT。它还使用了Guzzle

使用这个外观:

use Illuminate\Support\Facades\Http;

你可以简单地像这样写请求。

Http::get([URL]);

在你的情况下,你可以修改它。

Http::get('http://acme.biz');

如果你想要一个 json 响应,你也可以这样做:

$response = Http::get('http://acme.biz')->json();
return $response;

【讨论】:

感谢您的建议,但似乎因为 HTTP 客户端只是一个 Guzzle 包装器,所以它有完全相同的问题。 你也可以看到这个help center (***.com/questions/29822686/…) 谢谢,如果我重新启用 SSL 验证,这可能会解决 SSL 证书,但我无法捕捉超时的问题是另一个问题。 您可以使用try catch($e) 方法保证响应 或者你可以使用这个set_time_limit(10000);,但我建议不要使用它

以上是关于使用 Guzzle 捕获 CUrl 超时异常的主要内容,如果未能解决你的问题,请参考以下文章

从 Guzzle 中捕获异常

PHP cURL 随机超时,收到 100% 的正文

PHP - 为啥使用 Guzzle 而不是 cURL?

Prestashop Guzzle 冲突

如何使用Curl将这个mailchimp API请求转换为使用PHP的Guzzle?

将此 cURL 转换为 Guzzle